matlab--16进制转ASCII代码

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的区别

两者都是能够将数字转为字符串

  1. 相同点: 当str为一个含数字的字符串时, str2num 函数与 str2double 函数一样。
    在这里插入图片描述

  2. 不同点:当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

在这里插入图片描述

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值