我是靠谱客的博主 聪明故事,最近开发中收集的这篇文章主要介绍Simulink CAN PACK Message总线解包及处理Simulink CAN PACK Message总线解包,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Simulink CAN PACK Message总线解包

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

在这里插入图片描述
模型中用到了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

最后

以上就是聪明故事为你收集整理的Simulink CAN PACK Message总线解包及处理Simulink CAN PACK Message总线解包的全部内容,希望文章能够帮你解决Simulink CAN PACK Message总线解包及处理Simulink CAN PACK Message总线解包所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部