2024年最全CAN报文的打包与解包及代码自动生成_can信号的车速分辨率,2024年最新逆袭面经分享

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

感觉手动解包也是非常简单的,用到了C语言的位运算和移位处理。第3个字节首先与“11110000”进行与运算,取出该字节的高四位,然后进行右移4位的运算计算低4位的实际值;第4个字节首先与“00001111”进行与运算取出车速数据的高四位,再乘2的4次方(高字节占了4个位),最后进行相加就可以得到车速值了。

下面我将会用一个非常实际的例子,给各位演示如何进行CAN手动打包,并且和官方模块对比进行Mil测试,然后生成代码进行Sil测试,最后将生成的代码集成在编译器中。上面只是开胃小菜,下面整点硬的。

4.实例

在非Autosar架构下,CAN报文的解包和打包放在ASW进行解决我认为还是可行的,当然在非Autosar架构下,至少在学校做相关项目来看,ASW和BSW的界限还是不明显的。话又说回来,目前Autosar上实车还是比较少的,不过大势所趋,必须去了解学习!主要我采用基于模型设计是因为手写C能力目前不够,自动生成的代码肯定比我手写C效率高的,主要原因还是我太菜。
下面是FSAC中国大学生方程式赛车关于能量计的CAN协议,将车辆的数据通过CAN总线发送至能量计,供主办方回收车辆数据。下面直接贴图(直接给dbc不香吗,又不说什么编码,差评)。
在这里插入图片描述
简化需求:通过动力CAN和车身CAN上的信号数据,从新按照上图所示的CAN通信协议打包,输出可以直接发送至能量计的CAN数据。
由于第一次做,还是将矩阵信息列出来,这样方便我这种菜鸟入门理解。这里有列举0x502的矩阵协议。(居然整个17个bit的,我真是醉了。)
在这里插入图片描述

1.打包模型建立

直接上图,手动解包的模型如下。
在这里插入图片描述
这里贴上源代码逻辑是很清晰的了,convert作用为了求和的时候将数据类型一致,不然会报错。输出我定义了一个bus信号,生成代码后就是一个结构体变量了,结构体里有CAN的数据,ID和数据长度。如果您对解包逻辑不清晰,可以对照我上节讲的和手绘的CAN矩阵,再结合二进制和位运算的相关概念进行分析。下面我贴出剩下两个ID的报文协议源码。
在这里插入图片描述
在这里插入图片描述

2.数据对象管理

生成高可读性的代码是需要对模型里的对象进行数据类型的定义,这是非常关键。建完模型,直接Ctrl+B,代码不是不能用,而是用起来很困难,更没法后期标定了。整个模型架构如下。
在这里插入图片描述

这里我以Maltab2020a为例,2019b经过更改Simulink界面用起来更方便了,如果您使用低版本也是可以关联数据字典的。
首先,关联数据字典。
在这里插入图片描述
其次,新建一个数据字典DD。
在这里插入图片描述
然后,建立完后,点击左下角外部数据。
在这里插入图片描述
然后,在您的数据字典里面定义所有的信号和参数,并且指定您的信号的类型,维度和存储类型等等!存储类型十分重要,您接触过代码生成的话,相信这个存储类型重要性不言而喻。下面是我对本模型的数据字典内容。您可以参考一下。由于本次生成代码只是演示过程,方便集成的时候变量我已经定义,我将输入输出变量都定义为全局变量,事实上,输入变量为内部输入更好。在这里插入图片描述
在这里插入图片描述
其中,我用Simulink AliasType重新定义了uin8,double等名字(在Add处就可以添加),填入你想替换系统自定义的数据信息。因为我认为这样定义更符合我使用的硬件芯片习惯。在DD中进行定义后,您需要在如下图所示的地方进行替换。
在这里插入图片描述
还有一点需要注意的是,我在输出信号用BUS信号以便于维护和管理模型,那么在数据字典中也需要定义Bus信号,因为有三个Bus,我这里列举一个Bus对象。具体过程如下图所示。点击Add添加Bus对象。并且注意您data数组的维度!
在这里插入图片描述
在模型中您需要进行下列更改。
在这里插入图片描述
在最外层的输出模块上,您需要做一下操作。当您完成操作的时候,输出模块会显示内圈,和之前不同。之后还需要进队这条信号线进行数据关联,数据类型选择您定义好的Bus就行了。
在这里插入图片描述
最后完成三次,因为有三个不同的Bus对象,最后到Top层进行Signal关联到信号线。完成数据管理工作。
在这里插入图片描述
本次实例忽略单元测试覆盖率测试和模型检查,因为还没来得及设计大量的功能测试用例,去验证模型有无死逻辑和覆盖率能否达到要求,但是在后续的工作中这个工作是必须做到的,模型的可靠才是最重要的。

3.对比测试

官方的CANPACK模块肯定是经过严格的测试,可以放心用。那么我将手动解析模块和官方的进行对比,在大量的功能测试用例进行测试后,输出一致就可以表明我的模型是正确的,是可用的。这里为了简化,我就设计一组测试用例示例一下如何进行测试。
首先,右键空白界面,如图创建一个测试用例!我称这块为Mil测试!
在这里插入图片描述
如图选择,然后点击Ok
在这里插入图片描述
生成后的测试用例如下(输出进行了一些更改,方便对比,只输出data数据)。

我用excel简单写了一个没有任何意义的数值,作为本次的测试用例。并且将Excel表格导入Signal Builder模块,具体导入操作各位可以百度一下。非常简单,这里我就不多演示了。
在这里插入图片描述
将输出信号全部Logging,方便我们在SDI中查看两次仿真结果的对比。
在这里插入图片描述
然后点击运行。这个时候仿真结果已经出来了,那么我重新使用CANPACK模块打包,模型建立过程就不写了,十分简单,只需要在模块对话框中输入CAN协议的信息即可。就是比较花时间。同样生成一组测试用例,用刚才的测试用例对官方解包程序进行测试。官方PACK模块建模后和生成测试用例分别如下两图所示。
在这里插入图片描述
下面直接上结果,通过SDI查看,两者所有数据都是一致的,曲线吻合。
在这里插入图片描述
这里我没有Compare的原因是三个data数据的位置不一致,对比出来问题,所有我就一个一个进行对比,看看曲线是否重合。

4.等效性测试

当验证完模型的正确性后,那要开始生成代码了,如果您出于对代码生成工具的不信任,做Sil测试是必须的,当然测试方法也很简单,用之前的开发模型的功能测试用例做等效性测试是没有问题的。之前通过V&V工具箱生成了测试环境,并且模型引用了源模型,只需要右键模型->Block parameters。选择Sil即可,非常方便。
在这里插入图片描述
然后您引用的模型,就会出现SiL样式。
在这里插入图片描述
然后点击运行,这个时候软件会帮您自动把模型编译成可执行文件,这个时候验证的就是C代码了,而不是模型。运行完可以看一下对比结果。这个Sil测试需要时间长一些,可能我用的7年前的电脑原因吧-_-!。完成后进入SDI->Compare,对比Sil测试结果。误差选择0.000001。
在这里插入图片描述
从结果看非常舒爽对吧,说明生成的代码没有任何问题,和模型一致!然后您可以通过Embedded Coder quick start按钮进行代码生成,如何生成代码网上太多教程了,这里就不详细操作了。

5.代码集成

首先,在生成代码后会有一个代码生成报告(需要在设置中打开)。很多同学喜欢直接去看.c文件中的代码,我觉得完全没有必要,因为我可以保证我的代码100%的功能正确,所以我只要关心程序和.h头文件方便集成代码。
在这里插入图片描述
先看左上角的代码接口报告(Code Interface Report)。
在这里插入图片描述
输出为结构体。那么可以看看结构体里面有哪些东西呢,所以直接去看.h文件。
在这里插入图片描述

上图,宏定义非常符合手写代码的习惯。下面看结构体定义。
在这里插入图片描述
这下非常清楚了,我们只需要调用.c文件中的如下函数就可以实现模型的功能了。所有模型算法都在这个step函数中。
在这里插入图片描述
当然我们看一下自动代码生成的算法,很简洁清晰,比我手写不知道高到哪去了。
在这里插入图片描述

我们将一个.c和两个.h文件复制出来,ert.main文件直接放弃。将这几个文件放在您的编译器对应目录下,具体根据您的单片机使用而定,这里我用的是Stm32单片机。
在这里插入图片描述
在生成代码的时候是必须使用定步长的求解器,那么所谓的采样时间就是任务调度时间,我现在的板子上面跑的是裸机,没有RTOS,所以我只能根据定时器中断来计数,自己写一个任务调度,假设现在定时器中断时间为1ms,那么我的这个程序需要10ms调度一次。那么程序需要放在定时器中断服务函数中,并且自己写一个简单的任务调度程序,最后我需要通过CAN发送这个数据,库函数发CAN就非常简单了。
在这里插入图片描述
在CAN发送报文的函数如下,从函数接口就可以清晰对应生成出来代码的接口了。
在这里插入图片描述
如果您使用过STM32单片机可以很容易看懂这个操作,当然你需要在timer.c(定时器C文件)中include自动生成代码的.h文件。当然如果需要的实时性不高,您可以把这个任务放在main函数中的while(1)循环中,并且通过相应的标志位触发,只有对实时性要求很高的算法一般才放在定时器中断服务函数中。目前我在个人学习中还没有接触实时操作系统。最后编译一下代码,看看会不会出错。
在这里插入图片描述
代码非常好,一次成功,不过这一次成功也是经过了大量的验证,并不是建模以后就直接用了,这一点在学生时代最容易犯错,不经过大量的测试,就直接用,上车是非常危险的。

6.踩坑

本次实例踩的坑也很多啦。可能您会问,为什么不用已有的模块自动生成代码呢,原因如下:
1.没有DBC。
2.代码效率不够高。
3.锻炼自己一下对CAN报文的理解和简单的C基础。
之所以我说代码效率不高,是因为我已经做过测试了。下面是手动解包的代码行数和总字节数,在报告中都可以查看。
在这里插入图片描述
在这里插入图片描述
一共216行代码,用了93个字节。下面是自带模块的生成代码报告截图。相同的数据对象管理,生成都是RAM优先。
在这里插入图片描述
在这里插入图片描述
一共是729行代码和162个字节。所以再三权衡,我考虑手动打包信号。

5.总结

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

入式知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值