好文档 - 专业文书写作范文服务资料分享网站

MATLAB解析GPS数据程序 

天下 分享 时间: 加入收藏 我要投稿 点赞

. .

% 注:本程序可直接在MATLAB 2017a 中运行

%该脚本文件用于学习GPS数据的读取,需要做其他用途请自行修改代码 %本脚本文件的前面几行代码是要设置的一些参数 %默认使用COM3(需视情况修改) %波特率设为GPS模块默认的38400 %下面为程序源码 clear

num_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; %% 打开串口

a

. .

count_opentimes = 1;

while contains(serial3.status,'closed') > 0 && count_opentimes < num_MaxTry fopen(serial3); %打开串口

count_opentimes = count_opentimes+1; end

if contains(serial3.status,'open') < 1 disp('open failed!'); return end

%% 读取并处理数据 % 初始化

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

a

. .

%%

%将字符串根据'\\r\\n'划分成多个子字符串,同时去掉首尾无用的残余字符串 function out_strs = split_str2strs(StrData) if contains(class(StrData),'char') uint8(StrData); end

record = get_pos_enterflag(StrData); if StrData(1) == uint8('$') %开头为'$'的情况 flag_start = 1; else

if size(record,2) > 0 flag_start = record(1)+2; else

out_strs = cell(0,0); return end end

if StrData(end) == 13

flag_end = length(StrData)-1; else

if size(record,2) > 0 flag_end = record(end)-1; end end

if flag_start >= flag_end out_strs = cell(0,0); return end

a

. .

StrData = 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 > 1

out_strs{1,1} = char(StrData(1:record(1)-1)); if num_strs == 2

out_strs{num_strs,1} = char(StrData(record(1)+2:end)); else

for i = 2 : num_strs-1

out_strs{i,1} = char(StrData(record(i-1)+2:record(i)-1)); end

out_strs{num_strs,1} = char(StrData(record(i)+2:end)); end else

out_strs{1,1} = char(StrData); end

% 得到字符串中'\\r\\n'在字符串中的位置(实际为'\\r'的位置) function record = get_pos_enterflag(data) record = []; % 记录回车符号位置 for ii = 1 : length(data)-1 if data(ii) == 13 if data(ii+1) == 10 record = [record,ii]; ii = ii+1; end end end

a

. .

end end

% 得到具体GPS结构体数据

function GPS_Data_tmp = get_GPS_specificData(StrsData) GPS_Data_tmp = []; num_str = size(StrsData,1); for i = 1 : num_str str_tab = StrsData{i,1}; if contains(str_tab,'GGA') > 0 GPS_Data_tmp = GNGGA(str_tab); elseif contains(str_tab,'GSA') > 0 GPS_Data_tmp = GNGSA(str_tab); elseif contains(str_tab,'GSV') > 0 GPS_Data_tmp = GNGSV(str_tab); elseif contains(str_tab,'RMC') > 0 GPS_Data_tmp = GNRMC(str_tab); elseif contains(str_tab,'VTG') > 0 GPS_Data_tmp = GNVTG(str_tab); elseif contains(str_tab,'GLL') > 0 GPS_Data_tmp = GNGLL(str_tab); end end end

% 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;

a

MATLAB解析GPS数据程序 

..%注:本程序可直接在MATLAB2017a中运行%该脚本文件用于学习GPS数据的读取,需要做其他用途请自行修改代码%本脚本文件的前面几行代码是要设置的一些参数%默认使用COM3(需视情况修改)%波特率设为GPS模块默认的38400%下面为程序源码clearnum
推荐度:
点击下载文档文档为doc格式
9kxqa1nb5h41z4g1sgcd5uqa87r003016o1
领取福利

微信扫码领取福利

微信扫码分享