MATLAB解析GPS数据程序文件
- 格式:doc
- 大小:60.00 KB
- 文档页数:16
% 注:本程序可直接在MATLAB 2017a 中运行%该脚本文件用于学习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);clear s % 串口打开失败时使用此句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;while contains(serial3.status,'closed') > 0 && count_opentimes < num_MaxTry fopen(serial3); %打开串口count_opentimes = count_opentimes+1;endif contains(serial3.status,'open') < 1disp('open failed!');returnend%% 读取并处理数据% 初始化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);clear serial3%%%将字符串根据'\r\n'划分成多个子字符串,同时去掉首尾无用的残余字符串function out_strs = split_str2strs(StrData)if contains(class(StrData),'char')uint8(StrData);endrecord = get_pos_enterflag(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);returnStrData = 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_strs{1,1} = char(StrData(1:record(1)-1));if num_strs == 2out_strs{num_strs,1} = char(StrData(record(1)+2:end));elsefor i = 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'的位置)function record = get_pos_enterflag(data)record = []; % 记录回车符号位置for ii = 1 : length(data)-1if data(ii) == 13if data(ii+1) == 10record = [record,ii];ii = ii+1;endendendend% 得到具体GPS结构体数据function GPS_Data_tmp = get_GPS_specificData(StrsData)GPS_Data_tmp = [];num_str = size(StrsData,1);for i = 1 : num_strstr_tab = StrsData{i,1};if contains(str_tab,'GGA') > 0GPS_Data_tmp = GNGGA(str_tab);elseif contains(str_tab,'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,'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; Latitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_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_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_lisec = Time(8:10);GPS_Data_titude.degree = Latitude(1:2); % 纬度GPS_Data_titude.min = Latitude(3:4);tmp = str2double(Latitude(6:9));tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_titude.sec = num2str(floor(tmp));GPS_Data_lisec = 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_lisec = 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 = 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);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(count+1)-1);count=count+1;Latitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_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.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_lisec = Time(8:10);GPS_Data_titude.degree = Latitude(1:2); % 纬度GPS_Data_titude.min = Latitude(3:4);tmp = str2double(Latitude(6:9));tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_titude.sec = num2str(floor(tmp));GPS_Data_lisec = 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_lisec = 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;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)+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);endfunction GPS_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_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;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_titude.degree = Latitude(1:2); % 纬度GPS_Data_titude.min = Latitude(3:4);tmp = str2double(Latitude(6:9));tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_titude.sec = num2str(floor(tmp));GPS_Data_lisec = 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_lisec = 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% 更新获取到的相关数据function GPS_Data = Updata_GPU_Data(GPS_Data,GPS_Data_tmp)% 用不到的数据可以注释掉if isfield(GPS_Data_tmp,'Time') == 1GPS_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_lisec = GPS_Data_lisec;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_titude.degree = GPS_Data_titude.degree;GPS_titude.min = GPS_Data_titude.min;GPS_titude.sec = GPS_Data_titude.sec;GPS_lisec = GPS_Data_lisec;endif isfield(GPS_Data_tmp,'LatitudeDir') == 1GPS_titudeDir = GPS_Data_titudeDir;endif isfield(GPS_Data_tmp,'Longitude') == 1GPS_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_lisec = GPS_Data_lisec; endif isfield(GPS_Data_tmp,'LongitudeDir') == 1GPS_Data.LongitudeDir = 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.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;endif isfield(GPS_Data_tmp,'altitude') == 1GPS_Data.altitude = GPS_Data_tmp.altitude;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_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.MagneticAngle = GPS_Data_tmp.MagneticAngle;endif isfield(GPS_Data_tmp,'MagneticDir') == 1GPS_Data.MagneticDir = GPS_Data_tmp.MagneticDir;endif isfield(GPS_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; endif 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-%02s %02s:%02s:%02s:%03s',...GPS_Data.DATE.year,GPS_Data.DATE.month,GPS_Data.DATE.day,...GPS_Data.Time.hour,GPS_Data.Time.min,GPS_Data.Time.sec,GPS_lise c);Location = sprintf(' %s:%02s°%02s′%03s″%04s,%s:%02s°%02s′%03s″%04s',...GPS_titudeDir,GPS_titude.degree,GPS_titude.min,GPS_Data.L atitude.sec,GPS_lisec,...GPS_Data.LongitudeDir,GPS_Data.Longitude.degree,GPS_Data.Longitude.min,GPS_D ata.Longitude.sec,GPS_lisec);% 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(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_lisec = '0';GPS_Data.DATE.day = '29';GPS_Data.DATE.month = '8';GPS_Data.DATE.year = '18';GPS_titude.degree = '0'; % 纬度GPS_titude.min = '0';GPS_titude.sec = '0';GPS_lisec = '0';GPS_titudeDir = 'N';GPS_Data.Longitude.degree = '0'; % 经度GPS_Data.Longitude.min = '0';GPS_Data.Longitude.sec = '0';GPS_lisec = '0';GPS_Data.LongitudeDir = 'E';GPS_Data.GPSState = '0'; % GPS状态,0:未定位;1:无差分定位;2:带差分定位;3:无效GPS;6:正在估算GPS_Data.SatelliteNum = '0'; % 可用卫星数目GPS_Data.speed = '0';GPS_Data.velocity = '0';GPS_Data.LocationState = 'V';GPS_Data.altitude = '0'; % 海拔高度GPS_Data.CurState = '1'; % 当前状态,1:无定位信息;2:2D;3:3DGPS_Data.LocationMode = 'A'; % 定位模式,'A':自动,'M':手动GPS_Data.HDOP = '0.5'; % 水平精度因子GPS_Data.VDOP = '0.5'; % 垂直精度因子GPS_Data.PDOP = '0.5'; % 综合位置精度因子GPS_Data.TrueDir = '0'; % 方位角GPS_Data.MagneticAngle = '0'; % 磁偏角GPS_Data.MagneticDir = 'E'; % 磁偏角参考方向,E/W(东西经)GPS_Data.ReferenceTrueDir = 'T'; % 真实方向的参考方向,T:正北参照系 GPS_Data.RelativeDir = '0'; % 相对方向GPS_Data.ReferenceRelativeDir = 'M'; % M:磁北参照系GPS_Data.step = '0'; % 步长GPS_Data.stepflag = 'N';GPS_Data.PRN = '01'; % 正在使用的卫星PRN码编号end% 可实现静态显示输出容(防止输出容不同换行)function show_Message_str(strData)persistent CurMessage;if isempty(CurMessage)CurMessage = '';endfprintf(1,repmat('\b',1,numel(CurMessage)));fprintf(1,'%s',strData);CurMessage = strData;end。