%注:本程序可直接在MATLAB2017a中运行%该脚本文件用于学习GPS数据的读取,需要做其他用途请自行修改代码%本脚本文件的前面几行代码是要设置的一些参数%默认使用COM3(需视情况修改)%波特率设为GPS模块默认的38400%下面为程序源码clearnum_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_opentimesnum_MaxTryfopen(serial3);%打开串口count_opentimes=count_opentimes+1;endifcontains(serial3.status,'open')1disp('opencomfailed!');returnend%%读取并处理数据%初始化GPS_Data=GPS_Init();while(num_execute0)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);endrecord=get_pos_enterflag(StrData);ifStrData(1)==uint8('$')%开头为'$'的情况flag_start=1;elseifsize(record,2)0flag_start=record(1)+2;elseout_strs=cell(0,0);returnendendifStrData(end)==13flag_end=length(StrData)-1;elseifsize(record,2)0flag_end=record(end)-1;endendifflag_start=flag_endout_strs=cell(0,0);returnendStrData=StrData(flag_start:flag_end);%截取有效数据,方便下面划分子字符串record=get_pos_enterflag(StrData);num_strs=size(record,2)+1;out_strs=cell(num_strs,1);ifnum_strs1out_strs{1,1}=char(StrData(1:record(1)-1));ifnum_strs==2out_strs{num_strs,1}=char(StrData(record(1)+2:end));elsefori=2:num_strs-1out_strs{i,1}=char(StrData(record(i-1)+2:record(i)-1));endout_strs{num_strs,1}=char(StrData(record(i)+2:end));endelseout_strs{1,1}=char(StrData);end%得到字符串中'\r\n'在字符串中的位置(实际为'\r'的位置)functionrecord=get_pos_enterflag(data)record=[];%记录回车符号位置forii=1:length(data)-1ifdata(ii)==13ifdata(ii+1)==10record=[record,ii];ii=ii+1;endendendendend%得到具体GPS结构体数据functionGPS_Data_tmp=get_GPS_specificData(StrsData)GPS_Data_tmp=[];num_str=size(StrsData,1);fori=1:num_strstr_tab=StrsData{i,1};ifcontains(str_tab,'GGA')0GPS_Data_tmp=GNGGA(str_tab);elseifcontains(str_tab,'GSA')0GPS_Data_tmp=GNGSA(str_tab);elseifcontains(str_tab,'GSV')0GPS_Data_tmp=GNGSV(str_tab);elseifcontains(str_tab,'RMC')0GPS_Data_tmp=GNRMC(str_tab);elseifcontains(str_tab,'VTG')0GPS_Data_tmp=GNVTG(str_tab);elseifcontains(str_tab,'GLL')0GPS_Data_tmp=GNGLL(str_tab);endendend%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=24GPS_Data_tmp.Time.hour=num2str(str2num(hour)+8-24);elseGPS_Data_tmp.Time.hour=num2str(str2num(hour)+8);endendfunctionGPS_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_t