matlab–16进制转ASCII代码
前言
由于对RTK设备输出转换的需要,撰写了一个matlab转换16进制到ASCII代码。
一、读文件
1.textscan
C = textscan(fileID,formatSpec)
将已打开的文本文件中的数据读取到元胞数组 C。该文本文件由文件标识符 fileID 指示。使用 fopen 可打开文件并获取 fileID 值。完成文件读取后,请调用 fclose(fileID) 来关闭文件。
配合fopen使用!
2.cell数组
1.cell数组的创建
可以直接通过{}类似于矩阵的直接赋值:a={‘winter’,123,‘coming’,‘哈哈’};
2.cell数组的访问
与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。
元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()
a={1,2,3};
a{1}=[];%并不能删除第一个cell单元,只是变成空值
a(1)=[];%删除第一个单元
3.字符转换命令
hex2dec(data)
16进制转到十进制
char(hex2dec(data))
16进制转到char
4.num2str()与num2double的区别
两者都是能够将数字转为字符串
-
相同点: 当str为一个含数字的字符串时, str2num 函数与 str2double 函数一样。
-
不同点:当str为多个字符串构成的数组时, str2num 函数与 str2double 函数有区别。
如:
二、代码
path = 'D:\Rtk主机-2020-11-12-14-27-30.txt';
fid = fopen(path, 'r+');
if fid == -1
disp('fopen failed');
else
ReadData = textscan(fid,'%s');
end
fclose(fid);
data_hex = ReadData{1}; % 取cell
len = length(data_hex);
% 16进制转为ASCII
row_num = 0; % 行
line_num = 0; % 列
data_char = {};
flag_time_trans = 0; % 时间格式转换标志
flag = 0; % 十六进制转ASCII
for i=1:len
if(char(data_hex(i,1))=='<')
row_num = row_num+1;
line_num = 1;
flag_time_trans = 1;
disp(['开始转换第',num2str(row_num),'行!']);
continue;
elseif(char(data_hex(i,1))=='>')
flag = 0; % 完成一行的转换
continue;
elseif(char(data_hex(i,1))=='|')
flag = 1;
continue;
elseif(flag == 1)
data_char(row_num,line_num) = {hex2char(data_hex(i,1))}; % 16进制数据转换为char
line_num = line_num + 1;
elseif(flag_time_trans == 1)
seconds = seconds_trans(data_hex(i,1),data_hex(i+1,1)); % 时间转换格式
data_char(row_num,line_num) = {seconds};
line_num = line_num + 1;
flag_time_trans = 0;
end
en
function data = hex2char(data_hex)
% 把0x去掉从十六进制转成10进制再转成char
data = char(data_hex);
data = data(1,3:4);
data = char(hex2dec(data));
end
function seconds = seconds_trans(years,hours)
% 时间字符转为数字
years = char(years);
hours = char(hours);
seconds = num2str(str2double(hours(1,1:2))*3600000+str2double(hours(1,4:5))*60000+str2double(hours(1,7:8))*1000+str2double(hours(1,10:12)));
end
- 结果
输出data_char 为单个字符储存,根据RTK协议加入了部分代码能够整理符合协议的格式
% 整合单个字符为GGA格式
[m,n] = size(data_char);
DATA_char(:,1) = data_char(:,1);
list = [];
line_num = 0; % 列
for i=1:m
list = [];
line_num = 2;
for j =2:n
if (data_char{i,j} == ',')
DATA_char{i,line_num} = list;
DATA_char{i,line_num+1} = {','};
line_num = line_num+2;
list = [];
elseif (data_char{i,j} == 13)
DATA_char{i,line_num} = list;
line_num = line_num+1;
list = [];
elseif (data_char{i,j} == 10)
continue;
elseif(data_char{i,j} == [])
list = [];
line_num =2;
break; % 结束一行
elseif(data_char{i,j} == '$')
list = [list,data_char{i,j}];
else
list = [list,data_char{i,j}];
end
end
end