



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、。% 注:本程序可直接在 MATLAB 2017a 中运行%该脚本文件用于学习GPS数据的读取,需要做其他用途请自行修改代码%本脚本文件的前面几行代码是要设置的一些参数%默认使用 COM3(需视情况修改)%波特率设为GPS模块默认的38400%下面为程序源码clearnum_execute = 100; %执行次数num_SingleRead = 150; %单次从串口读取的字节数( 最好设置足够大(最低大概设为80),保证单次读取的数据包含一条完整的GPS数据 )Timedelay = 0.2; %用于延时读取串口数据BaudRate = 38400; %读取数据的波特率Terminator
2、 = 'CR'num_MaxTry = 5; % 打开串口的最多尝试次数BytesAvailableFcnCount = 1000;%设置参数% delete(instrfindall); %串口打开失败时使用此句% delete(s);clear s %串口打开失败时使用此句serial3 = serial('COM3');% 串口设置serial3.BytesAvailableFcnMode = 'byte'% serial3.InputBufferSize = 38400; %输出波特率serial3.BaudRate = BaudRate
3、; %读入波特率% serial3.OutputBufferSize = 1024; serial3.BytesAvailableFcnCount = BytesAvailableFcnCount;serial3.ReadAsyncMode = 'continuous'serial3.Terminator = Terminator;%打开串口count_opentimes = 1;。1。while contains(serial3.status,'closed') > 0 && count_opentimes < num_MaxTry
4、fopen(serial3); %打开串口count_opentimes = count_opentimes+1;endif contains(serial3.status,'open') < 1disp('open com failed!');returnend%读取并处理数据% 初始化GPS_Data = GPS_Init();while(num_execute > 0)GPS_DataStrs = fread(serial3,num_SingleRead,'char');%一次读出 10 个字符GPS_DataStrs = re
5、shape(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);%从串口的接收缓
6、存读数据%关闭串口并删除相关数据fclose(serial3);%关闭串口delete(serial3);clear serial3。2。%将字符串根据 'rn' 划分成多个子字符串 , 同时去掉首尾无用的残余字符串 function out_strs = split_str2strs(StrData)if contains(class(StrData),'char')uint8(StrData);endrecord = get_pos_enterflag(StrData);if StrData(1) = uint8('$') %开头为 '
7、;$' 的情况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);returnend。3。StrData = StrDa
8、ta(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_strs-1out_strsi,1
9、= 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
10、) = 10record = record,ii;ii = ii+1;endendend。4。endend% 得到具体 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
11、,'GSA') > 0GPS_Data_tmp = GNGSA(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
12、,'GLL') > 0GPS_Data_tmp = GNGLL(str_tab);endendend% 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;。5。Latitude= str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.La
13、titudeDir = 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_D
14、ata_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 = Ti
15、me(1:2);GPS_Data_tmp.Time.min = Time(3:4);GPS_Data_tmp.Time.sec = Time(5:6);GPS_Data_tmp.Tlisec = 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.s
16、ec = num2str(floor(tmp);GPS_Data_tmp.Llisec = 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;。6。GPS_Data_tmp.Longitude.sec = num2str(floor(
17、tmp);GPS_Data_tmp.Llisec = num2str(tmp-floor(tmp)*10000);% UTC 时间转换为北京时间hour = GPS_Data_tmp.Time.hour;if str2num(hour)+8 >= 24GPS_Data_tmp.Time.hour = num2str(str2num(hour)+8-24); elseGPS_Data_tmp.Time.hour = num2str(str2num(hour)+8); endendfunction GPS_Data_tmp = GNGSA(str_tab)index
18、= 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_ta
19、b(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);endfunction GPS_Data_tmp = GNGSV(str_tab)% 此语句为与卫星有关的信息(包括卫星方位,卫星编
20、号)% 暂时用不着,不处理GPS_Data_tmp = ;。7。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(count+1)-1);count=count+1;Latitude= str_tab(index(count)+1:in
21、dex(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
22、)+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(
23、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.Tlisec = Time(8:10);GPS_Data_tmp.Latitude.degree = Latitude(1:2); %纬度。8。GPS_Data_tmp.Latitude
24、.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.Llisec = num2str(tmp-floor(tmp)*10000);GPS_Data_tmp.Longitude.degree = Longitude(1:3); %经度GPS_Data_tmp.Longitude.min = Longitude(4:5);tmp
25、= str2double(Longitude(7:10);tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_tmp.Longitude.sec = num2str(floor(tmp);GPS_Data_tmp.Llisec = 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 时间转换为北
26、京时间hour = GPS_Data_tmp.Time.hour;if str2num(hour)+8 >= 24GPS_Data_tmp.Time.hour = num2str(str2num(hour)+8-24); elseGPS_Data_tmp.Time.hour = num2str(str2num(hour)+8); endendfunction GPS_Data_tmp = GNVTG(str_tab)index = strfind(str_tab,',');count = 1;GPS_Data_tmp.TrueDir=str_tab(index(count
27、)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.ReferenceTrueDir=str_tab(index(count)+1:index(count+1)-1);count=count+1;。9。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_Da
28、ta_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);endfunction GPS_Data_tmp = GNGLL(str_tab)in
29、dex = 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(
30、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.m
31、in = Latitude(3:4);tmp = str2double(Latitude(6:9);tmp = tmp*6/1000; % tmp = tmp/10000*60;。10。GPS_Data_tmp.Latitude.sec = num2str(floor(tmp);GPS_Data_tmp.Llisec = num2str(tmp-floor(tmp)*10000);GPS_Data_tmp.Longitude.degree = Longitude(1:3); %经度GPS_Data_tmp.Longitude.min = Longitude(4:5);tm
32、p = str2double(Longitude(7:10);tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_tmp.Longitude.sec = num2str(floor(tmp);GPS_Data_tmp.Llisec = 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);end% 更新获取到
33、的相关数据function GPS_Data = Updata_GPU_Data(GPS_Data,GPS_Data_tmp)% 用不到的数据可以注释掉if isfield(GPS_Data_tmp,'Time') = 1 GPS_Data.Time.hour = GPS_Data_tmp.Time.hour;GPS_Data.Time.min = GPS_Data_tmp.Time.min;GPS_Data.Time.sec = GPS_Data_tmp.Time.sec;GPS_Data.Tlisec = GPS_Data_tmp.Tlisec;
34、endif isfield(GPS_Data_tmp,'DATE') = 1GPS_Data.DATE.day = GPS_Data_tmp.DATE.day;GPS_Data.DATE.month = GPS_Data_tmp.DATE.month;GPS_Data.DATE.year = GPS_Data_tmp.DATE.year;endif isfield(GPS_Data_tmp,'Latitude') = 1GPS_Data.Latitude.degree = GPS_Data_tmp.Latitude.degree;GPS_Data.Latitud
35、e.min = GPS_Data_tmp.Latitude.min;。11。GPS_Data.Latitude.sec = GPS_Data_tmp.Latitude.sec;GPS_Data.Llisec = GPS_Data_tmp.Llisec;endif isfield(GPS_Data_tmp,'LatitudeDir') = 1GPS_Data.LatitudeDir = GPS_Data_tmp.LatitudeDir;endif isfield(GPS_Data_tmp,'Longitude') = 1
36、GPS_Data.Longitude.degree = GPS_Data_tmp.Longitude.degree;GPS_Data.Longitude.min = GPS_Data_tmp.Longitude.min;GPS_Data.Longitude.sec = GPS_Data_tmp.Longitude.sec;GPS_Data.Llisec = GPS_Data_tmp.Llisec;endif isfield(GPS_Data_tmp,'LongitudeDir') = 1GPS_Data.LongitudeDir
37、= GPS_Data_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
38、.speed;endif isfield(GPS_Data_tmp,'velocity') = 1GPS_Data.velocity = GPS_Data_tmp.velocity;endif isfield(GPS_Data_tmp,'LocationState') = 1GPS_Data.LocationState = GPS_Data_tmp.LocationState;。12。endif isfield(GPS_Data_tmp,'altitude') = 1GPS_Data.altitude = GPS_Data_tmp.altitud
39、e;endif isfield(GPS_Data_tmp,'CurState') = 1GPS_Data.CurState = GPS_Data_tmp.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
40、_tmp,'VDOP') = 1GPS_Data.VDOP = GPS_Data_tmp.VDOP;endif isfield(GPS_Data_tmp,'PDOP') = 1GPS_Data.PDOP = GPS_Data_tmp.PDOP;endif isfield(GPS_Data_tmp,'TrueDir') = 1GPS_Data.TrueDir = GPS_Data_tmp.TrueDir;endif isfield(GPS_Data_tmp,'MagneticAngle') = 1GPS_Data.MagneticA
41、ngle = GPS_Data_tmp.MagneticAngle;endif isfield(GPS_Data_tmp,'MagneticDir') = 1GPS_Data.MagneticDir = GPS_Data_tmp.MagneticDir;endif isfield(GPS_Data_tmp,'ReferenceTrueDir') = 1。13。GPS_Data.ReferenceTrueDir = GPS_Data_tmp.ReferenceTrueDir;endif isfield(GPS_Data_tmp,'RelativeDir
42、39;) = 1GPS_Data.RelativeDir = GPS_Data_tmp.RelativeDir;endif isfield(GPS_Data_tmp,'ReferenceRelativeDir') = 1GPS_Data.ReferenceRelativeDir = GPS_Data_tmp.ReferenceRelativeDir;endif isfield(GPS_Data_tmp,'step') = 1GPS_Data.step = GPS_Data_tmp.step;endif isfield(GPS_Data_tmp,'step
43、flag') = 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-%02s %02s:%02s:%02s:%03s',.GPS_Data.DATE.year,GPS_Data.DATE.month,GPS_Data
44、.DATE.day,.GPS_Data.Time.hour,GPS_Data.Time.min,GPS_Data.Time.sec,GPS_Data.Tlis ec);Location =sprintf(' %s:%02s° %02s %03s%04s,%s:%02s° %02s %03s %04s',.GPS_Data.LatitudeDir,GPS_Data.Latitude.degree,GPS_Data.Latitude.min,GPS_Dat a.Latitude.sec,GPS_Data.Llisec,.。14
45、。GPS_Data.LongitudeDir,GPS_Data.Longitude.degree,GPS_Data.Longitude.min,GPS_ Data.Longitude.sec,GPS_Data.Llisec);% Others = sprintf(' GPSState:%s,SatelliteNum:%02s,Speed:%03s,Velocity:%s,LocationState:%s',.%GPS_Data.GPSState,GPS_Data.SatelliteNum,GPS_Data.speed,GPS_Data.velocity,
46、GPS_Data.LocationState);% show_Message_str(strcat(DataAndTime,Location,Others); show_Message_str(strcat(DataAndTime,Location);end% 初始化 GPS数据结构体function GPS_Data = GPS_Init()GPS_Data.Time.hour = '0'GPS_Data.Time.min = '0'GPS_Data.Time.sec = '0'GPS_Data.Tlisec = '0'GPS_Data.DATE.day = '29'GPS_Data.DATE.month = '8'GPS_Data.DATE.year = '18'GPS_Data.Latitude.degre
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 成人法制安全教育
- 苹果品质管理
- 适应数字化转型的品牌策略计划
- 时尚行业保安工作实施计划
- 四年级上册数学教案- 第五单元-去图书馆(描述简单的路线图)教案-北师大版
- 2025年姿态控制推力器、推进剂贮箱项目合作计划书
- 招聘年底工作总结
- 2025年会议电视系统(含终端)项目建议书
- 2025年进排气系统:进排气管项目合作计划书
- 校长外出应聘简历
- 益生菌精品课件
- 超声科质量控制内容与标准完整
- 研究思路图模板
- 耳鼻咽喉头颈外科学第篇 鼻科学
- 安徽省环境监测收费标准
- 沃尔玛全国的分布
- 电子营业执照下载确认书(外籍法定代表人)
- 钢结构厂房工程施工组织设计方案(85页)
- T∕CGCC 17-2018 商业信誉评价体系
- 数独6×6初级打印版
- 九种常规曲线测井方法
评论
0/150
提交评论