概述
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
公众号:智能驾驶软件宝典(汽车电子,数据分析,机器学习)
最后
以上就是饱满帆布鞋为你收集整理的基于Simulink实现CAN报文解析(unpack)与打包(pack)任务的全部内容,希望文章能够帮你解决基于Simulink实现CAN报文解析(unpack)与打包(pack)任务所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复