MATLAB解析GPS数据程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
% 注:本程序可直接在MATLAB 2017a 中运行
%该脚本文件用于学习GPS数据的读取,需要做其他用途请自行修改代码
%本脚本文件的前面几行代码是要设置的一些参数
%默认使用COM3(需视情况修改)
%波特率设为GPS模块默认的38400
%下面为程序源码
clear
num_execute = 100; % 执行次数
num_SingleRead = 150; %单次从串口读取的字节数(最好设置足够大(最低大概设为80),保证单次读取的数据包含一条完整的GPS数据)
Timedelay = 0.2; % 用于延时读取串口数据
BaudRate = 38400; % 读取数据的波特率
Terminator = 'CR';
num_MaxTry = 5; %打开串口的最多尝试次数
BytesAvailableFcnCount = 1000;
%% 设置参数
% delete(instrfindall); % 串口打开失败时使用此句
% delete(s);clear s % 串口打开失败时使用此句
serial3 = serial('COM3');
% 串口设置
serial3.BytesAvailableFcnMode = 'byte';
% serial3.InputBufferSize = 38400; % 输出波特率
serial3.BaudRate = BaudRate; % 读入波特率
% serial3.OutputBufferSize = 1024;
serial3.BytesAvailableFcnCount = BytesAvailableFcnCount;
serial3.ReadAsyncMode = 'continuous';
serial3.Terminator = Terminator;
%% 打开串口
count_opentimes = 1;
while contains(serial3.status,'closed') > 0 && count_opentimes < num_MaxTry fopen(serial3); %打开串口
count_opentimes = count_opentimes+1;
end
if contains(serial3.status,'open') < 1
disp('open com failed!');
return
end
%% 读取并处理数据
% 初始化
GPS_Data = GPS_Init();
while(num_execute > 0)
GPS_DataStrs = fread(serial3,num_SingleRead,'char'); %一次读出10个字符 GPS_DataStrs = reshape(GPS_DataStrs,1,[]);
GPS_DataStrs = split_str2strs(GPS_DataStrs);
GPS_Data_tmp = get_GPS_specificData(GPS_DataStrs);
GPS_Data = Updata_GPU_Data(GPS_Data,GPS_Data_tmp);
show_GPS_Data(GPS_Data);
pause(Timedelay); % 延时
num_execute = num_execute-1;
end
% fprintf(s,'abcd'); %给串口的发送数据
% fscanf(s); %从串口的接收缓存读数据
%% 关闭串口并删除相关数据
fclose(serial3); %关闭串口
delete(serial3);
clear serial3
%%
%将字符串根据'\r\n'划分成多个子字符串,同时去掉首尾无用的残余字符串
function out_strs = split_str2strs(StrData)
if contains(class(StrData),'char')
uint8(StrData);
end
record = get_pos_enterflag(StrData);
if StrData(1) == uint8('$') %开头为'$'的情况
flag_start = 1;
else
if size(record,2) > 0
flag_start = record(1)+2;
else
out_strs = cell(0,0);
return
end
end
if StrData(end) == 13
flag_end = length(StrData)-1;
else
if size(record,2) > 0
flag_end = record(end)-1;
end
end
if flag_start >= flag_end
out_strs = cell(0,0);
return
end
StrData = StrData(flag_start:flag_end); % 截取有效数据,方便下面划分子字符串 record = get_pos_enterflag(StrData);
num_strs = size(record,2)+1;
out_strs = cell(num_strs,1);