欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Simulink CAN PACK Message总线解包及处理

程序员文章站 2022-04-01 18:42:34
...

Simulink CAN PACK Message总线解包

开发环境:本项目是基于simulink 2019a完成。
项目背景:需要在发出去的CANmessage中加载CRC16数据。
实现方案如下:
项目中要用到pack加载dbc,但data区后两字节需要加载CRC16,CRC16计算的数据为前6字节,而pack前均为信号量,故需要对pack后的封包数据进行提取解封,然后处理CRC然后再合并数据总线成CAN message BUS。网上找了许久也没有相关资源,就自己做了一个示例,验证运行正常。希望可以帮到和我一样对汽车CAN总线解包封包有需求的。
** 模型整体框图如下 **
Simulink CAN PACK Message总线解包及处理
** CRC子函数展开框图如下 **

Simulink CAN PACK Message总线解包及处理
模型中用到了BUS selector,create BUS 模块进行解包和封包。
CRC使用的是MATLAB Function实现。语言为M语言。

function CAN_Message = Modbus_CRC16(message)
CAN_Message =uint8(zeros(8,1));
crc_reg =  uint16(hex2dec('0000'));
crc_reg_xor =  uint16(hex2dec('0000'));
CRC_poly = uint16(hex2dec('C86C'));
for ii = 1:6     %length(message))
    CAN_Message(ii)=message(ii);
    data_s=uint16(message(ii));
    current = bitshift(data_s,8);%左移8位
    for jj = 1:8
        crc_reg_xor = bitxor(crc_reg,current);
        if bitget(crc_reg_xor,16) == 1
            crc_reg = bitxor(bitshift(crc_reg,1),CRC_poly);%uint16(51308)
        else
            crc_reg = bitshift(crc_reg,1);
        end
        current = bitshift(current,1);
    end
end

CAN_Message(7)=bitand( crc_reg, uint16(255));%uint8(mod(crc_reg,1e8));
CAN_Message(8)=uint8(bitshift(crc_reg,-8));

其中新建CAN message BUS 遇到过一点小麻烦,就是BUS总线中再包含data[8],通过对create BUS 设置后解决。

希望以上能帮到和我有一样问题的同学。
代码连接地址:
https://download.csdn.net/download/weixin_43255491/12245007

相关标签: CAN PACK