版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公务员2006年国考《申论》真题卷及答案
- 校园环境质量监测方案
- 幼儿园小班一月总结
- 消防安装工程劳务承包合同书(30篇)
- 高中期末自我总结
- 小儿多发性抽动症课件
- 腰椎间盘突出症的治疗课件
- 保定学院《篮球》2022-2023学年第一学期期末试卷
- 保定学院《大学体育》2021-2022学年第一学期期末试卷
- 宝鸡文理学院《中学思想政治课程标准与教材分析》2022-2023学年第一学期期末试卷
- 中暑临床诊疗指南
- 班主任基本功大赛:模拟情景题及参考答案汇编(初中组)
- 《新古典综合派》课件
- 改变世界的机器 精益生产之道
- 手机摄影入门基础知识教程
- 《反应时间上》课件
- 教师培训课件教学设计与教案编写
- 海事集装箱装箱检查员考试题库
- 中建一局劳务分包合同范本
- 无人驾驶车辆人机交互设计
- 2024年浙江省普通高中学业水平适应性考试政治试题(原卷版)
评论
0/150
提交评论