MATLAB解析GPS数据程序.docx
- 文档编号:23932543
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:19
- 大小:18.18KB
MATLAB解析GPS数据程序.docx
《MATLAB解析GPS数据程序.docx》由会员分享,可在线阅读,更多相关《MATLAB解析GPS数据程序.docx(19页珍藏版)》请在冰豆网上搜索。
MATLAB解析GPS数据程序
%注:
本程序可直接在MATLAB2017a中运行
%该脚本文件用于学习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);clears%串口打开失败时使用此句
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;
whilecontains(serial3.status,'closed')>0&&count_opentimes fopen(serial3);%打开串口 count_opentimes=count_opentimes+1; end ifcontains(serial3.status,'open')<1 disp('openfailed! '); 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); clearserial3 %% %将字符串根据'\r\n'划分成多个子字符串,同时去掉首尾无用的残余字符串 functionout_strs=split_str2strs(StrData) ifcontains(class(StrData),'char') uint8(StrData); end record=get_pos_enterflag(StrData); ifStrData (1)==uint8('$')%开头为'$'的情况 flag_start=1; else ifsize(record,2)>0 flag_start=record (1)+2; else out_strs=cell(0,0); return end end ifStrData(end)==13 flag_end=length(StrData)-1; else ifsize(record,2)>0 flag_end=record(end)-1; end end ifflag_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); ifnum_strs>1 out_strs{1,1}=char(StrData(1: record (1)-1)); ifnum_strs==2 out_strs{num_strs,1}=char(StrData(record (1)+2: end)); else fori=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'的位置) functionrecord=get_pos_enterflag(data) record=[];%记录回车符号位置 forii=1: length(data)-1 ifdata(ii)==13 ifdata(ii+1)==10 record=[record,ii]; ii=ii+1; end end end end end %得到具体GPS结构体数据 functionGPS_Data_tmp=get_GPS_specificData(StrsData) GPS_Data_tmp=[]; num_str=size(StrsData,1); fori=1: num_str str_tab=StrsData{i,1}; ifcontains(str_tab,'GGA')>0 GPS_Data_tmp=GNGGA(str_tab); elseifcontains(str_tab,'GSA')>0 GPS_Data_tmp=GNGSA(str_tab); elseifcontains(str_tab,'GSV')>0 GPS_Data_tmp=GNGSV(str_tab); elseifcontains(str_tab,'RMC')>0 GPS_Data_tmp=GNRMC(str_tab); elseifcontains(str_tab,'VTG')>0 GPS_Data_tmp=GNVTG(str_tab); elseifcontains(str_tab,'GLL')>0 GPS_Data_tmp=GNGLL(str_tab); end end end %GPS字符串解析 functionGPS_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; GPS_Data_tmp.LatitudeDir=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; GPS_Data_tmp.LongitudeDir=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.GPSState=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.SatelliteNum=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.HDOP=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.altitude=str_tab(index(count)+1: index(count+1)-1);count=count+1; %other=str_tab(index(count)+1: end); %进一步处理 GPS_Data_tmp.Time.hour=Time(1: 2); GPS_Data_tmp.Time.min=Time(3: 4); GPS_Data_tmp.Time.sec=Time(5: 6); GPS_Data_tmp.Time.millisec=Time(8: 10); GPS_Data_tmp.Latitude.degree=Latitude(1: 2);%纬度 GPS_Data_tmp.Latitude.min=Latitude(3: 4); tmp=str2double(Latitude(6: 9)); tmp=tmp*6/1000;%tmp=tmp/10000*60; GPS_Data_tmp.Latitude.sec=num2str(floor(tmp)); GPS_Data_tmp.Latitude.millisec=num2str((tmp-floor(tmp))*10000); GPS_Data_tmp.Longitude.degree=Longitude(1: 3);%经度 GPS_Data_tmp.Longitude.min=Longitude(4: 5); tmp=str2double(Longitude(7: 10)); tmp=tmp*6/1000;%tmp=tmp/10000*60; GPS_Data_tmp.Longitude.sec=num2str(floor(tmp)); GPS_Data_tmp.Longitude.millisec=num2str((tmp-floor(tmp))*10000); %UTC时间转换为北京时间 hour=GPS_Data_tmp.Time.hour; ifstr2num(hour)+8>=24 GPS_Data_tmp.Time.hour=num2str(str2num(hour)+8-24); else GPS_Data_tmp.Time.hour=num2str(str2num(hour)+8); end end functionGPS_Data_tmp=GNGSA(str_tab) index=strfind(str_tab,','); count=1; GPS_Data_tmp.LocationMode=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.CurState=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.PRN=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.PDOP=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.HDOP=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.VDOP=str_tab(index(count)+1: index(count+1)-1);count=count+1; %other=str_tab(index(count)+1: end); end functionGPS_Data_tmp=GNGSV(str_tab) %此语句为与卫星有关的信息(包括卫星方位,卫星编号) %暂时用不着,不处理 GPS_Data_tmp=[]; end functionGPS_Data_tmp=GNRMC(str_tab) index=strfind(str_tab,','); count=1; Time=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.LocationState=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; GPS_Data_tmp.LatitudeDir=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; GPS_Data_tmp.LongitudeDir=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.speed=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.TrueDir=str_tab(index(count)+1: index(count+1)-1);count=count+1; Date=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.MagneticAngle=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.MagneticDir=str_tab(index(count)+1: index(count+1)-1);count=count+1; %other=str_tab(index(count)+1: end); %进一步处理 GPS_Data_tmp.Time.hour=Time(1: 2); GPS_Data_tmp.Time.min=Time(3: 4); GPS_Data_tmp.Time.sec=Time(5: 6); GPS_Data_tmp.Time.millisec=Time(8: 10); GPS_Data_tmp.Latitude.degree=Latitude(1: 2);%纬度 GPS_Data_tmp.Latitude.min=Latitude(3: 4); tmp=str2double(Latitude(6: 9)); tmp=tmp*6/1000;%tmp=tmp/10000*60; GPS_Data_tmp.Latitude.sec=num2str(floor(tmp)); GPS_Data_tmp.Latitude.millisec=num2str((tmp-floor(tmp))*10000); GPS_Data_tmp.Longitude.degree=Longitude(1: 3);%经度 GPS_Data_tmp.Longitude.min=Longitude(4: 5); tmp=str2double(Longitude(7: 10)); tmp=tmp*6/1000;%tmp=tmp/10000*60; GPS_Data_tmp.Longitude.sec=num2str(floor(tmp)); GPS_Data_tmp.Longitude.millisec=num2str((tmp-floor(tmp))*10000); GPS_Data_tmp.DATE.day=Date(1: 2); GPS_Data_tmp.DATE.month=Date(3: 4); GPS_Data_tmp.DATE.year=Date(5: 6); %UTC时间转换为北京时间 hour=GPS_Data_tmp.Time.hour; ifstr2num(hour)+8>=24 GPS_Data_tmp.Time.hour=num2str(str2num(hour)+8-24); else GPS_Data_tmp.Time.hour=num2str(str2num(hour)+8); end end functionGPS_Data_tmp=GNVTG(str_tab) index=strfind(str_tab,','); count=1; GPS_Data_tmp.TrueDir=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.ReferenceTrueDir=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.RelativeDir=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.ReferenceRelativeDir=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.step=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.stepflag=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.velocity=str_tab(index(count)+1: index(count+1)-1);count=count+1; %other=str_tab(index(count)+1: end); end functionGPS_Data_tmp=GNGLL(str_tab) index=strfind(str_tab,','); count=1; Latitude=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.LatitudeDir=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; GPS_Data_tmp.LongitudeDir=str_tab(index(count)+1: index(count+1)-1);count=count+1; Date=str_tab(index(count)+1: index(count+1)-1);count=count+1; GPS_Data_tmp.LocationState=str_tab(index(count)+1: index(count+1)-1);count=count+1; %other=str_tab(index(count)+1: end); %进一步处理 GPS_Data_tmp.Latitude.degree=Latitude(1: 2);%纬度 GPS_Data_tmp.Latitude.min=Latitude(3: 4); tmp=str2double(Latitude(6: 9)); tmp=tmp*6/1000;%tmp=tmp/10000*60; GPS_Data_tmp.Latitude.sec=num2str(floor(tmp)); GPS_Data_tmp.Latitude.millisec=num2str((tmp-floor(tmp))*10000); GPS_Data_tmp.Longitude.degree=Longitude(1: 3);%经度 GPS_Data_tmp.Longitude.min=Longitude(4: 5); tmp=str2double(Longitude(7: 10)); tmp=tmp*6/1000;%tmp=tmp/10000*60; GPS_Data_tmp.Longitude.sec=num2str(floor(tmp)); GPS_Data_tmp.Longitude.millis
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MATLAB 解析 GPS 数据 程序