MATLAB解析GPS数据程序_第1页
MATLAB解析GPS数据程序_第2页
MATLAB解析GPS数据程序_第3页
MATLAB解析GPS数据程序_第4页
MATLAB解析GPS数据程序_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、注:本程序可直接在 MATLAB 2017a 中运行该脚本文件用于学习 GPS数据的读取,需要做其他用途请自行修改代码本脚本文件的前面几行代码是要设置的一些参数默认使用 COM3(需视情况修改)波特率设为 GPS模块默认的 38400下面为程序源码clearnum_execute = 100; %执行次数num_SingleRead = 150; %单次从串口读取的字节数( 最好设置足够大(最低大概设为80 ),保证单次读取的数据包含一条完整的GPS数据 )Timedelay = 0.2; %用于延时读取串口数据BaudRate = 38400; % Terminator = CR;读取数据的

2、波特率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 = 102

3、4; serial3.BytesAvailableFcnCount = BytesAvailableFcnCount; serial3.ReadAsyncMode = continuous;serial3.Terminator = Terminator;打开串口count_opentimes = 1;while contains(serial3.status,closed) 0 & count_opentimes num_MaxTryfopen(serial3); %打开串口count_opentimes = count_opentimes+1;endif contains(serial3.s

4、tatus,open) 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)

5、; %延时num_execute = num_execute-1;end% fprintf(s,abcd);%给串口的发送数据% fscanf(s);%从串口的接收缓存读数据关闭串口并删除相关数据fclose(serial3);%关闭串口delete(serial3);clear serial3%将字符串根据 rn 划分成多个子字符串 ,同时去掉首尾无用的残余字符串function out_strs = split_str2strs(StrData)if contains(class(StrData),char)uint8(StrData);endrecord = get_pos_enterf

6、lag(StrData);if StrData(1) = uint8($) %flag_start = 1;elseif size(record,2) 0flag_start = record(1)+2;elseout_strs = cell(0,0);returnendendif StrData(end) = 13flag_end = length(StrData)-1;elseif size(record,2) 0flag_end = record(end)-1;endendif flag_start = flag_endout_strs = cell(0,0);return开头为 $ 的

7、情况endStrData = 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 1out_strs1,1 = char(StrData(1:record(1)-1);if num_strs = 2out_strsnum_strs,1 = char(StrData(record(1)+2:end); elsefor i = 2 : num_str

8、s-1out_strsi,1 = char(StrData(record(i-1)+2:record(i)-1);endout_strsnum_strs,1 = char(StrData(record(i)+2:end);endelseout_strs1,1 = char(StrData);end得到字符串中 rn 在字符串中的位置 ( 实际为 r 的位置 ) function record = get_pos_enterflag(data)record = ; %记录回车符号位置for ii = 1 : length(data)-1if data(ii) = 13if data(ii+1)

9、= 10record = record,ii;= ii+1;endendendendend得到具体 GPS结构体数据function GPS_Data_tmp = get_GPS_specificData(StrsData)GPS_Data_tmp = ;num_str = size(StrsData,1);for i = 1 : num_strstr_tab = StrsDatai,1;if contains(str_tab,GGA) 0GPS_Data_tmp = GNGGA(str_tab);elseif contains(str_tab,GSA) 0GPS_Data_tmp = GNG

10、SA(str_tab);elseif contains(str_tab,GSV) 0GPS_Data_tmp = GNGSV(str_tab);elseif contains(str_tab,RMC) 0GPS_Data_tmp = GNRMC(str_tab);elseif contains(str_tab,VTG) 0GPS_Data_tmp = GNVTG(str_tab);elseif contains(str_tab,GLL) 0GPS_Data_tmp = GNGLL(str_tab);endendendGPS 字符串解析function GPS_Data_tmp = GNGGA(

11、str_tab)index = strfind(str_tab,);count = 1;TimeLatitude= str_tab(index(count)+1:index(count+1)-1);count=count+1; = 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;Longitude1);count=count+1;= str_tab(index(count

12、)+1:index(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 1);count=count+1;=

13、 str_tab(index(count)+1:index(count+1)-GPS_Data_tmp.altitude 1);count=count+1;= str_tab(index(count)+1:index(count+1)-%other= str_tab(index(count)+1:end);% 进一步处理纬度tmp = str2double(Latitude(6:9);tmp = tmp*6/1000; % tmp = tmp/10000*60;经度tmp = str2double(Longitude(7:10);tmp = tmp*6/1000; % tmp = tmp/10

14、000*60;UTC 时间转换为北京时间if str2num(hour)+8 = 24endfunction GPS_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= s

15、tr_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(c

16、ount)+1:end);endfunction GPS_Data_tmp = GNGSV(str_tab)此语句为与卫星有关的信息(包括卫星方位,卫星编号)暂时用不着,不处理GPS_Data_tmp = ;endfunction GPS_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(

17、count+1)-1);count=count+1;Latitude1);count=count+1;= str_tab(index(count)+1:index(count+1)-GPS_Data_tmp.LatitudeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;Longitude1);count=count+1;= str_tab(index(count)+1:index(count+1)-GPS_Data_tmp.LongitudeDir = str_tab(index(count)+1:index(coun

18、t+1)-1);count=count+1;GPS_Data_tmp.speed 1);count=count+1;= str_tab(index(count)+1:index(count+1)-GPS_Data_tmp.TrueDir 1);count=count+1;= str_tab(index(count)+1:index(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

19、+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);% 进一步处理纬度tmp = str2double(Latitude(6:9);tmp = tmp*6/1000; % tmp = tmp/10000*60;经度tmp = str2double(Longitude(7:10);tmp = tmp*6/1000; % tmp = tmp/10000*60;UTC 时间转换

20、为北京时间if str2num(hour)+8 = 24endfunction GPS_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_ta

21、b(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

22、_tmp.velocity 1);count=count+1;= str_tab(index(count)+1:index(count+1)-%other= str_tab(index(count)+1:end);endfunction GPS_Data_tmp = GNGLL(str_tab)index = strfind(str_tab,);Latitude1);count=count+1;= str_tab(index(count)+1:index(count+1)-GPS_Data_tmp.LatitudeDir = str_tab(index(count)+1:index(count

23、+1)-1);count=count+1;Longitude1);count=count+1;= str_tab(index(count)+1:index(count+1)-GPS_Data_tmp.LongitudeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;Date1);count=count+1;= str_tab(index(count)+1:index(count+1)-GPS_Data_tmp.LocationState = str_tab(index(count)+1:index(count+1)-1)

24、;count=count+1;%other= str_tab(index(count)+1:end);进一步处理纬度tmp = str2double(Latitude(6:9);tmp = tmp*6/1000; % tmp = tmp/10000*60;tmp = str2double(Longitude(7:10);tmp = tmp*6/1000; % tmp = tmp/10000*60;经度end更新获取到的相关数据function GPS_Data = Updata_GPU_Data(GPS_Data,GPS_Data_tmp)用不到的数据可以注释掉if isfield(GPS_D

25、ata_tmp,Time) = 1endif isfield(GPS_Data_tmp,DATE) = 1endif isfield(GPS_Data_tmp,Latitude) = 1endif isfield(GPS_Data_tmp,LatitudeDir) = 1GPS_Data.LatitudeDir = GPS_Data_tmp.LatitudeDir;endif isfield(GPS_Data_tmp,Longitude) = 1endif isfield(GPS_Data_tmp,LongitudeDir) = 1GPS_Data.LongitudeDir = GPS_Dat

26、a_tmp.LongitudeDir;endif isfield(GPS_Data_tmp,GPSState) = 1GPS_Data.GPSState = GPS_Data_tmp.GPSState;endif isfield(GPS_Data_tmp,SatelliteNum) = 1GPS_Data.SatelliteNum = GPS_Data_tmp.SatelliteNum;endif isfield(GPS_Data_tmp,speed) = 1GPS_Data.speed = GPS_Data_tmp.speed;endif isfield(GPS_Data_tmp,veloc

27、ity) = 1GPS_Data.velocity = GPS_Data_tmp.velocity;endif isfield(GPS_Data_tmp,LocationState) = 1GPS_Data.LocationState = GPS_Data_tmp.LocationState;endif isfield(GPS_Data_tmp,altitude) = 1GPS_Data.altitude = GPS_Data_tmp.altitude;endif isfield(GPS_Data_tmp,CurState) = 1GPS_Data.CurState = GPS_Data_tm

28、p.CurState;endif isfield(GPS_Data_tmp,LocationMode) = 1GPS_Data.LocationMode = GPS_Data_tmp.LocationMode;endif isfield(GPS_Data_tmp,HDOP) = 1GPS_Data.HDOP = GPS_Data_tmp.HDOP;endif isfield(GPS_Data_tmp,VDOP) = 1GPS_Data.VDOP = GPS_Data_tmp.VDOP;endif isfield(GPS_Data_tmp,PDOP) = 1GPS_Data.PDOP = GPS

29、_Data_tmp.PDOP;endif isfield(GPS_Data_tmp,TrueDir) = 1GPS_Data.TrueDir = GPS_Data_tmp.TrueDir;endif isfield(GPS_Data_tmp,MagneticAngle) = 1GPS_Data.MagneticAngle = GPS_Data_tmp.MagneticAngle;endif isfield(GPS_Data_tmp,MagneticDir) = 1GPS_Data.MagneticDir = GPS_Data_tmp.MagneticDir;endif isfield(GPS_

30、Data_tmp,ReferenceTrueDir) = 1GPS_Data.ReferenceTrueDir = GPS_Data_tmp.ReferenceTrueDir;endif isfield(GPS_Data_tmp,RelativeDir) = 1GPS_Data.RelativeDir = GPS_Data_tmp.RelativeDir;endif isfield(GPS_Data_tmp,ReferenceRelativeDir) = 1GPS_Data.ReferenceRelativeDir = GPS_Data_tmp.ReferenceRelativeDir;end

31、if isfield(GPS_Data_tmp,step) = 1GPS_Data.step = GPS_Data_tmp.step;endif isfield(GPS_Data_tmp,stepflag) = 1GPS_Data.stepflag = GPS_Data_tmp.stepflag;endif isfield(GPS_Data_tmp,PRN) = 1GPS_Data.PRN = GPS_Data_tmp.PRN;endend显示相关 GPS数据function show_GPS_Data(GPS_Data)DataAndTime = sprintf(20%02s-%02s-%0

32、2s %02s:%02s:%02s:%03s,.Location = sprintf( %s:%02s%02s %03s %04s,%s:%02s%02s %03s %04s,.Others = sprintf( GPSState:%s,SatelliteNum:%02s,Speed:%03s,Velocity:%s,LocationState:%s,.%GPS_Data.GPSState,GPS_Data.SatelliteNum,GPS_Data.speed,GPS_Data.velocity,GPS _Data.LocationState);show_Message_str(strcat(Data

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论