1 / 16
文档名称:

MATLAB解析GPS数据程序.pdf

格式:pdf   大小:430KB   页数:16页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

MATLAB解析GPS数据程序.pdf

上传人:fuxiyue 2025/4/20 文件大小:430 KB

下载得到文件列表

MATLAB解析GPS数据程序.pdf

相关文档

文档介绍

文档介绍:该【MATLAB解析GPS数据程序 】是由【fuxiyue】上传分享,文档一共【16】页,该文档可以免费在线阅读,需要了解更多关于【MATLAB解析GPS数据程序 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。 : .
% 注:本程序可直接在 MATLAB 2017a 中运行
%该脚本文件用于学习 GPS 数据的读取,需要做其他用途请自行修改代码
%本脚本文件的前面几行代码是要设置的一些参数
%默认使用 COM3(需视情况修改)
%波特率设为 GPS 模块默认的 38400
%下面为程序源码
clear
num_execute = 100; % 执行次数
num_SingleRead = 150; %单次从串口读取的字节数(最好设置足够大(最低大概设为
80),保证单次读取的数据包含一条完整的 GPS 数据)
Timedelay = ; % 用于延时读取串口数据
BaudRate = 38400; % 读取数据的波特率
Terminator = 'CR';
num_MaxTry = 5; %打开串口的最多尝试次数
BytesAvailableFcnCount = 1000;
%% 设置参数
% delete(instrfindall); % 串口打开失败时使用此句
% delete(s);clear s % 串口打开失败时使用此句
serial3 = serial('COM3');
% 串口设置
= 'byte';
% = 38400; % 输出波特率
= BaudRate; % 读入波特率
% = 1024;
= BytesAvailableFcnCount;
= 'continuous'; : .
= Terminator;
%% 打开串口
count_opentimes = 1;
while contains(,'closed') > 0 && count_opentimes < num_MaxTry
fopen(serial3); %打开串口
count_opentimes = count_opentimes+1;
end
if contains(,'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);
if num_strs > 1
out_strs{1,1} = char(StrData(1:record(1)-1));
if num_strs == 2
out_strs{num_strs,1} = char(StrData(record(1)+2:end));
else
for i = 2 : num_strs-1
out_strs{i,1} = char(StrData(record(i-1)+2:record(i)-1));
end
out_strs{num_strs,1} = char(StrData(record(i)+2:end));
end
else
out_strs{1,1} = char(StrData);
end
% 得到字符串中'\r\n'在字符串中的位置(实际为'\r'的位置)
function record = get_pos_enterflag(data)
record = []; % 记录回车符号位置
for ii = 1 : length(data)-1
if data(ii) == 13
if data(ii+1) == 10
record = [record,ii];
ii = ii+1;
end
end
end : .
end
end
% 得到具体 GPS 结构体数据
function GPS_Data_tmp = get_GPS_specificData(StrsData)
GPS_Data_tmp = [];
num_str = size(StrsData,1);
for i = 1 : num_str
str_tab = StrsData{i,1};
if contains(str_tab,'GGA') > 0
GPS_Data_tmp = GNGGA(str_tab);
elseif contains(str_tab,'GSA') > 0
GPS_Data_tmp = GNGSA(str_tab);
elseif contains(str_tab,'GSV') > 0
GPS_Data_tmp = GNGSV(str_tab);
elseif contains(str_tab,'RMC') > 0
GPS_Data_tmp = GNRMC(str_tab);
elseif contains(str_tab,'VTG') > 0
GPS_Data_tmp = GNVTG(str_tab);
elseif contains(str_tab,'GLL') > 0
GPS_Data_tmp = GNGLL(str_tab);
end
end
end
% GPS 字符串解析
function GPS_Data_tmp = GNGGA(str_tab)
index = strfind(str_tab,',');
count = 1;
Time = str_tab(index(count)+1:index(count+1)-1);count=count+1;
Latitude = str_tab(index(count)+1:index(count+1)-1);count=count+1; : .
= str_tab(index(count)+1:index(count+1)-
1);count=count+1;
Longitude = str_tab(index(count)+1:index(count+1)-
1);count=count+1;
= str_tab(index(count)+1:index(count+1)-
1);count=count+1;
= str_tab(index(count)+1:index(count+1)-
1);count=count+1;
= str_tab(index(count)+1:index(count+1)-
1);count=count+1;
= str_tab(index(count)+1:index(count+1)-
1);count=count+1;
= str_tab(index(count)+1:index(count+1)-
1);count=count+1;
% other = str_tab(index(count)+1:end);
% 进一步处理
= Time(1:2);
= Time(3:4);
= Time(5:6);
= Time(8:10);
= Latitude(1:2); % 纬度
= Latitude(3:4);
tmp = str2double(Latitude(6:9));
tmp = tmp*6/1000; % tmp = tmp/10000*60;
= num2str(floor(tmp));
= num2str((tmp-floor(tmp))*10000);
= Longitude(1:3); % 经度
= Longitude(4:5);
tmp = str2double(Longitude(7:10));