matlab大小端模式转化十进制

小端模式:内存的低地址存数据的低位,内存的高地址存数据的高位。低低高高。 2,大端模式:内存的低位存数据的高位,内存的高地址存数据的低位。 低高高低

使用matlab实现了小端模式的数据处理,并且将处理后的数据写入到excel表格中,大端处理方式类似。

处理前 处理后

读取设备的值,按小段模式存储,需要分析其数据进行滤波处理

读取通道1 通道2 通道3的数据
将两个字节的数据 小端模式转化为十进制

% 1,小端模式:内存的低地址存数据的低位,内存的高地址存数据的高位。低低高高。 2,大端模式:内存的低位存数据的高位,内存的高地址存数据的低位。 低高高低
% 最高位为符号位,正数为0 负数为1
% 小端模式:先传过来小的,再传大的, E5 FD,低字节为E5 高字节为FD
% 原始数据,数据格式是: 0xAA + 通道1(2byte 小端)+ 通道2(2byte 小端)+ 通道3(2byte 小端)+ checksum(2byte)
% 处理后将数据写入到.xlsx表格中

function Main()
global runall
runall = 1; % 0 只读取其中一个文件 1:读取文件夹下所有的文件
[filename, pathname] = uigetfile('*.*', '选择数据文件','MultiSelect', 'on'); %选择文件
if isequal(filename,0) ; return;end
if runall == 1
    list = dir([pathname,'*.txt']); 
    list_len = length(list);
    for i = 1:list_len
        filename = list(i).name;
        ReadData(pathname, filename);
    end
else
     ReadData(pathname, filename);
end
end


%读取通道1 通道2 通道3的数据
function ReadData(pathname, filename)
    fileName = fullfile(pathname, filename);
    data_struct = importdata(fileName);
    if isequal(class(data_struct), 'struct')
        data = data_struct.textdata;
    else
        data = data_struct;
    end

    k = 1; % k为处理数的index
    for i =1:length(data)
        j=1;
         while j < length(data{i}) - 1
            %AA E5 FD E3 FF 0A 00 D2 FD
            if isequal(data{i}(j:j+1), 'AA')  % 处理以AA开头的后面的数字
                if 1
                    second_data = hex2dec(data{i}(j+6:j+7)); % 将高位字节的两位数转为10进制

                    % 处理第一个通道的数字,先将低字节和高字节拼接
                    low_bit = data{i}(j+3:j+4);
                    high_bit = data{i}(j+6:j+7);
                    raw_data(k, 1) = Hex2Dec(second_data,low_bit, high_bit);

                    % 处理第二个通道的数字,先将低字节和高字节拼接
                    symbol=hex2dec(data{i}(j+12:j+13));
                    low_bit = data{i}(j+9:j+10);
                    high_bit = data{i}(j+12:j+13);
                    raw_data(k, 2) = Hex2Dec(symbol,low_bit, high_bit);

                    % 处理第三个通道的数字,先将低字节和高字节拼接
                    symbol=hex2dec(data{i}(j+18:j+19));
                    low_bit = data{i}(j+15:j+16);
                    high_bit = data{i}(j+18:j+19);
                    raw_data(k, 3) = Hex2Dec(symbol,low_bit, high_bit);
                else % 分别处理
                    second_data = hex2dec(data{i}(j+6:j+7)); % 将高位字节的两位数转为10进制

                    % 处理第一个通道的数字,先将低字节和高字节拼接
                    low_bit = data{i}(j+3:j+4);
                    high_bit = data{i}(j+6:j+7);
                    data_high_low = strcat(high_bit, low_bit);
                    if(second_data > 127) % 最高位为1, 负数
                        raw_data(k, 1) = -(hex2dec('FFFF') - hex2dec(data_high_low));
                    else % 正数不需要处理
                        raw_data(k, 1) = hex2dec(data_high_low);
                    end

                    % 处理第二个通道的数字,先将低字节和高字节拼接
                    symbol=hex2dec(data{i}(j+12:j+13));

                    low_bit = data{i}(j+9:j+10);
                    high_bit = data{i}(j+12:j+13);
                    data_high_low = strcat(high_bit, low_bit);
                    if(symbol > 127) % 最高位为1, 负数
                        raw_data(k, 2) = -(hex2dec('FFFF') - hex2dec(data_high_low));
                    else % 正数不需要处理
                        raw_data(k, 2) = hex2dec(data_high_low);
                    end

                    % 处理第三个通道的数字,先将低字节和高字节拼接
                    symbol=hex2dec(data{i}(j+18:j+19));

                    low_bit = data{i}(j+15:j+16);
                    high_bit = data{i}(j+18:j+19);
                    data_high_low = strcat(high_bit, low_bit);
                    if(symbol > 127) % 最高位为1, 负数
                        raw_data(k, 3) = -(hex2dec('FFFF') - hex2dec(data_high_low));
                    else % 正数不需要处理
                        raw_data(k, 3) = hex2dec(data_high_low);
                    end

                end

                k = k+1;
                j = j+ 25;
            else
                j=j+1;
            end
         end
    end

    % 将处理后的数字写入到对应的文件中
    name = strsplit(filename,'.');
    wfile = strcat(name(1),'.xlsx');
    xlswrite(wfile{1},raw_data);
end


%将两个字节的数据 小端模式转化为十进制
%symbol 符号位:提取高字节,判断最高位是0-正数,1-负数 
%low_bit 低字节的数据 
%high bit 高字节的数据 
%eg:FD E5--> -538 data 返回转为10进制的数据
function data = Hex2Dec(symbol,low_bit, high_bit)
    data_high_low = strcat(high_bit, low_bit);
    if(symbol > 127) % 最高位为1, 负数
        data = -(hex2dec('FFFF') - hex2dec(data_high_low));
    else % 正数不需要处理
        data = hex2dec(data_high_low);
    end
end

....

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚努力的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值