CAN报文的打包与解包及代码自动生成

CAN报⽂的打包与解包及代码⾃动⽣成
水貂肉
本⽂⽬录
1.背景
学汽车电⼦的同学可能都⽆法逃过CAN总线这道坎,我个⼈认为⼊门CAN总线是学习汽车电⼦的第⼀课。如何根据信号对CAN信号进⾏打包和如何根据CAN协议对数据进⾏解包,是在实践中必须解决的问题,得不到CAN线上的数据,说啥都是⽩扯。写这篇博客的⽬的是因为⾃⼰在前期对CAN通信矩阵的理解不到位,⽐如摩托罗拉编码和因特尔编码在CAN矩阵中的形式。这篇博客我也是将最近学到的知识分享出来,在此也特别感谢某主机⼚的⼯程师在这⼏天在代码⽣成⽅⾯对我的指导,没有他的帮助,我也不会很快将某些概念理解透彻。
2.所需要的软件与硬件
1. 电脑⼀台。
2. Matlab/Simulink(Simulink V&V Toolbox,Vehicle Network Toolbox,Embedded Coder)
3. Keil5编译器。(⽤于⽣成的代码集成)
3.Motorola编码和Intel编码
作为在校学⽣,学校⾥⾯的项⽬或者外购的⼀些产品回来后,都⽆法获得产品的DBC⽂件(商家总说说我们没有,我TM…),所以⼏乎都需要⾃⼰⼿动根据商家提供的各种花⾥胡哨的⽂档进⾏CAN协议的处理。
CAN总线数据场有8个字节,扩展帧和标准帧是⼀样的,只不过ID范围更多,这⾥只讨论标准帧。因为我⽬前还不会制作DBC⽂件,所以就⽤⼿绘图的形式表达⼀下CAN通信矩阵。如下图所⽰。
对于⼀个uint8的字节有8个位,数据场有8个字节,所以整个数据场能包含的最⼤数值是2的64⽅减去1。只需要确定报⽂的ID和数据长度,就可以将这8个字节发送出去,其他节点收到后进⾏解包即可。回到主题,Inter编码和Motorola编码是两种不同的⽅式,计算机有两种储存数据的⽅式:⼤端字节序(Big Endian)和⼩端字节序(Little Endian)。
⼤端字节序:⾼位字节在前,低位字节在后,这是咱们⼈的写字⽅式。
⼩端字节序:低位字节在前,⾼位字节在后。
如果⼤家不理解我上⼀个图给⼤家看⼀下。这⾥我们定义⼀个车速信号,
这⾥我假设⼀个车速信号在CAN矩阵的起始位是bit20,长度是8个bit。那么按照⼩端字节(Intel)就数据在CAN矩阵中应该如下图所⽰。
很明显,从低字节到⾼字节。那么如果按照⼤端字节序(Motorola)来定义就应该按照下图所⽰。
低温脱硝催化剂
从图看很明显,⾼位字节在前,低位字节在后。不过在⾮跨字节的信号中,摩托罗拉和因特尔编码没有区别。
在数据场中,信号还会涉及到分辨率和偏移量这两个概念。⽐如车速信号的分辨率是0.0078125,偏移量是1,那么在解包的时候就需要按照如下公式计算。
⾮跨字节:解包值 = 字节数据*分辨率+偏移量。跨字节就是需要视情况⽽定了,毕竟占位不同。
喷砂工艺在打包的时候是不是就可以按照相反⽅向计算了呢?
1.⾃动打包和解包
第⼀次接触⾃动打包和解析还是使⽤的dSPACE的RTICAN,确实⾮常⽅便。最近我发现Simulink⼯具箱中的Vehicle Network Toolbox也可以做到,但是…,⽀持的硬件就只有Vector,NI等⼟豪朋友使⽤的,淘宝的⼏百块钱的CAN卡是不⽀持的,屌丝还是退出直播间吧。不过不影响打包和解包模块的使⽤。
使⽤⽅法很简单,就⽤上⼀节的例⼦。车速信号,Inter编码,起始位值是第3个字节的第5位,长度8位,分辨率0.5,⽆偏移量。在CAN PACK和CAN UNPACK模块中设置如下。
PACK和CAN UNPACK模块中设置如下。
打包和解包的信号定义必须完全⼀致,ID必须完全⼀致,长度也必须完全⼀致。那么运⾏仿真看⼀下,可以发现输⼊和输出的值是⼀样的。
特厚钢板2.⼿动解包
如果需要⼿动进⾏解包应该如何处理呢,那就需要⽤到C的知识了,我相信看我博客的编程能⼒肯定都⽐我厉害。我再次看⼀下信号的定义,属于跨字节定义。计算公式如下:
速度值 = 第三个字节的⾼四位 +第四个字节的低四位。
我认为CAN矩阵可以给我带来最直观的认识,这也是我为什么在解包和打包的时候会将CAN矩阵画出来再看信号定义。
既然知道怎么做了,那么我们就可以开始⼿动解包了。
感觉⼿动解包也是⾮常简单的,⽤到了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.打包模型建⽴
直接上图,⼿动解包的模型如下。

本文发布于:2024-09-20 20:38:22,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/179189.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:解包   字节   数据   矩阵   信号   打包   编码
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议