使用matlab验证一段报文的checksum

使用场景:

存在一段报文,想要验证一下这段报文的checksum是否正确。

解决方向:

1.了解checksum的算法,并尝试构造
2. 单条报文,去验证算法是否正确
3. 能将验证的结果,在matlab界面上显示出来
4. 报文数据的导入,并找到需要checksum的报文
5. 轮询,一一验证

具体操作:

一、背景资料

已知算法:Checksum: IDMSB XOR IDLSB XOR Byte1 XOR Byte2 XOR Byte3 XOR Byte4 XOR Byte5 XOR Byte6XOR Byte7
如图,checksum 在byte0
报文的layout

二、算法构造

算法是报文ID和报文数据的简单异或,验证算法是否正确,需要引入输入数据,这里我用了input函数。

ID = input('Please input the ID: ');

C1 = bitshift(ID,-8); %报文高8位
C2 = bitand(ID,255);  %报文低8位
CRC_Temp = bitxor(C1,C2);

Msg = input('Please input the Message Data : ');

CRC_Temp = uint8(CRC_Temp);
Msg = uint8(Msg);
for i = 2:8
    CRC_Temp = bitxor(CRC_Temp,Msg(i));
end
三、算法验证

已有算法,也有输入输出,却不够直观。简单做了一个验证函数

ID_name = uint16(ID);
ID_name = dec2hex(ID_name);
result_ok = ['The checksum of 0x',ID_name,' is OK'];
result_nok = ['The checksum of 0x',ID_name,' is Wrong'];
if CRC_Temp == Msg(1)
    disp(result_ok);
else
    disp(result_nok);
end

给了两组数据验证一下(一好一坏)
脚本验证
结果是期望的,nice!
将它打包成子函数,格式如下:

function  result = checksum(sr_id,sr_data)
···
end
四、报文数据处理

首先,将asm数据导出到matlab。这里我导入了一个LocalCAN.asc的报文数据。

% step1 导入文件
fidin=fopen('LocalCAN.asc');                              % 打开文件             
fidout=fopen('mkmatlab.txt','w');                         % 创建MKMATLAB.txt文件 
while ~feof(fidin)                                        % 判断是否为文件末尾               
    tline=fgetl(fidin);                                   % 从文件读行   
    if double(tline(4))>=48 && double(tline(4))<=57       % 判断首字符(4)是否是数值 
        
       fprintf(fidout,'%s\n\n',tline);                    % 如果是数字行,把此行数据写入文件MKMATLAB.txt 
       continue                                           % 如果是非数字继续下一次循环 
    end 
end 
fclose(fidout); 
MK=importdata('MKMATLAB.txt');                            % 将生成的MKMATLAB.txt文件导入工作空间,变量名为MK,实际上它不显示出来 

打开MK,可以发现第3列是报文ID,7~14列是报文数据
在这里插入图片描述
其次,观察数据的表现形式,设计对应的算法。比如说,我只要0x340的checksum检验数据,并对检验后的数据一个汇总。(具体问题,具体分析,根据自身需求,需要变更以下算法);

MsgId = MK.textdata(:,3);
len = cellfun('length',MsgId);
len = len';
len = length(len);
CheckValAll = 1;

for i = 1:len  
    id = MK.textdata(i,3);
    try
        id = cell2mat(id);
        id = hex2dec(id);
    catch
    end
    if id == 0x340  
        data = MK.textdata(i,7:14);
        Msg = cell2mat(data);
        Msg = [hex2dec(Msg(1:2)),hex2dec(Msg(3:4)),hex2dec(Msg(5:6)),hex2dec(Msg(7:8)),...
        hex2dec(Msg(9:10)),hex2dec(Msg(11:12)),hex2dec(Msg(13:14)),hex2dec(Msg(15:16))];   
    
        CheckVal = checksum(id,Msg);
        CheckValAll = bitand(CheckValAll,CheckVal);
        

         if CheckValAll == false 
             break;
         end
    end
end

if CheckValAll
    disp('All Checkum is OK');
else
    disp('The Checksum is ERR');
end

最后,观察执行效果:
在这里插入图片描述
数据,与期望结果一致。
脚本完成,有需要可以直接去套用了。

结论

在工作中,做一些方便的小脚本,可以优化自己的效率;
学无止境,共勉!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值