基于Simulink实现CAN报文解析(unpack)与打包(pack)任务

CAN报文的解析与打包

  在如今的汽车电子中,常用到雷达,激光雷达等多种传感器。传感器各种信号根据其信号长度与编码类型,打包成CAN报文发送到控制器,则控制器需要做出解析。
  如下图所示:一帧CAN报文里可存放许多信号(各信号根据长度,编码格式“塞”进CAN报文)
  对于解析工作,可采取结构体位域方式,也可采取Simulink加载dbc的方式。前者直观方便,但对于Motorola编码的CAN报文需要反向定义,手写代码易出错。后者是基于dbc实现的模型代码生成,较为方便可靠性强。
  本文将介绍基于Simulink的方式实现的CAN报文解析工作,对于结构体位域法可参照作者另一篇文章。
在这里插入图片描述

Simulink CAN UNPACK使用

方式一(粗糙版):
  首先unpack模块需要接入CAN_MSG,这里可以拉取一个CAN_Receive模块来作为unpack的输入。下一步,配置CAN_Configuration,调整波特率。
在这里插入图片描述  接下来,拉取CAN unpack解析模块,模块的输出(即解析后的信号)可以手动添加,也可以利用dbc文件来导入。实际工程中多用dbc的方式。如下图所示:
在这里插入图片描述
  信号解析过后,通常会将解析后的各种信号以结构体的形式封装起来。这里就需要用到Bus Creator控件
在这里插入图片描述  这里注意,Bus Creator中的Output data type需要利用Bus editor进行编辑,可以自己手动添加。也可以利用Matlab命令读取我们先前写好的头文件
在这里插入图片描述
PS!!!头文件定义的结构体,信号一定要与unpack模块输出的顺序和数量保持一致,否则会编译出错。
在这里插入图片描述
  保存工程,生成代码(Embedded Code Generation),如下所示:在这里插入图片描述

方式二(推荐):
  一般来说,在解析CAN报文前,都会在Simulink中制作相关的sldd/mat文件,主要定义如下结构:
1.CAN_RX_BUS结构
  在搭建模型前,我们要清楚模型的输入是什么?解析模型的输入->即控制器接收到的原始CAN报文,如今CAN报文的接收大多采用中断的方式,一旦控制器收到了一条CAN报文,笔者会人为将这个报文转移至自己定义的buffer,以避免CAN报文发送周期过快导致当前报文来不及处理的丢帧现象,因此需要定义一个结构体,作为CAN报文的Buffer。
  对应到Simulink中,需要新建一个input模块,类型转为Bus,如下图所示:
在这里插入图片描述
2.定义Bus成员
  如下图所示,博主定义了CAN_RX_BUS(转化为C语言即结构体),其内部为诸如ConfigX_8_Receive_CAN_x_ID_XXX结构体成员。每一个Bus成员的格式为标准的CAN_MESSAGE, 格式如下图所示(可以自己裁剪或定义,但必须要有uint32格式的ID和8个字节的Data) 用于暂存接收到的原始CAN报文,同时也作为Simulink解析模型的input,如下图所示:

在这里插入图片描述

在这里插入图片描述
2.根据dbc定义各报文的结构体
  模型的输入问题已经由步骤1-2解决,下面就需要定义模型的输出,即解析后的信号如何输出?我们需要根据dbc文件定义好各报文的结构体,这一步通常需要和应用层商讨,从而确定接口格式。如下图所示,博主和将模型解析后的信号输出到自己定义的接口。这样应用层可直接通过此接口获取解析后的信号值。
在这里插入图片描述
3.搭建CAN_UNPACK模型
  搭建完CAN_RX_BUS和各报文的结构体后,就可以搭建模型了,节选一个报文为例,如下图所示:
在这里插入图片描述
4.生成代码

CAN_RX_BUS及各报文的结构体在.h文件中生成,如下所示
在这里插入图片描述
解析函数在.c文件中定义,如下所示在这里插入图片描述

  总结,无论采用哪种方式,解析的方式都是一样的,即UNPACK模块,但解析过程的报文输入和解析结果输出有所不同,也就是方式一和方式二的区别,核心是掌握Simulink中Bus Creator和Bus Selector的用法,灵活使用。

解析过程实则非常简单,但由于笔者表达能力有限,可能没有解释透彻,如需进一步交流,
  可加笔者的微信zhao598042621,

顺便给自己的公众号做个小广告:智能驾驶软件宝典

在这里插入图片描述

二. CAN PACK
  CAN PACK过程相反,CAN PACK模块的输入为各报文的信号值。
在这里插入图片描述在这里插入图片描述
  CAN信号的输出会根据out1模块的命名生成相应的  CAN_MESSAGE结构体,将此结构体与底层CAN_TX API接口关联即可。

三.总结
  不论是UNPACK还是PACK,其本身的模块是不变的,重要的是如何根据需求生成相应的数据结构,这取决于我们对BUS的灵活应用。
  如有疑问,欢迎指出,相互学习。

联系方式:
WX:zhao598042621
公众号:智能驾驶软件宝典(汽车电子,数据分析,机器学习)

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值