python处理车辆can通信 2

can通信

车辆内各个电子零部件间的常用通信协议。比如说发动机和变速箱,仪表和空调和车灯之类的。can总线就像一个插排,哪个节点要进来通信就把它的can线连进来。当然这只是一个比喻,具体的总线拓扑还得考虑总线长度,支线长度,是否有星型连接,信号反射,总线负载率,终端电阻位置等因素。can线就是一组双绞线,利用差分电压的值来表示bit的0和1。如果是车上的标准连接件,节点的总线间应该用带防水带屏蔽层的连接器连接。如果是debug,就把can线的canH(can高)和canL(can低)引线(线的颜色一般是黄高绿低)出来,接DB9头(pin脚一般是7高2底)。然后DB9头接can分析仪上(注意是否要加终端电阻)。高低接反或者终端电阻值不对,都会造成错误帧。

DBC文件

用来描述车辆通信的信息协议。一般编辑can dbc文件会用到vector公司的candb++ editor软件,也可以使用python的cantools库来生成。一般主机厂会把车辆的通信协议用xlsx表格来描述,哪个部件发哪条ID的报文,报文里具体有什么信号量,这些信号的真实物理值和数据场中的原始数值间的转换关系是怎么样的。dbc文件本质上就是一个文本文件,把它当成txt打开就行。里面的字符串具体含义是有规律的,可以用正则的方式去解码成容易理解的字面意思。所以xlsx和dbc的转换,实际上自己写python脚本就能完成。

BaiDu Apollo开源自动驾驶框架,它的源码里就有python脚本,用来实现dbc解析并生成proto和c++代码。这里大概说一下dbc解析的原理。python脚本中先将dbc以文本格式打开,按行读取文本内容,并按空格符分割获取每行中的所有词。DBC文件中的字符'@',"0+","0-","1+","1-","BO_","SG_","CM_","VAL_",”BA_DEF_“,"GenMsgCycleTime",“BA_” 等等是有特定标识符含义的,用来标志这行文本是描述报文或信号的字节序类型,数据类型(motorola,intel, signed,unsigned),报文名,报文ID,信号值枚举表,信号原始数值和真实物理值的线性转换关系,信号值单位,信号属性,报文周期等等。通过判断这些特殊字符的位置,就能获取必要的dbc内容信息,然后用python的list或dict存起来,按照特定的字符串模板(简单的f-string就能实现),就能生成proto和c++代码,或者任意想要的格式。

cantools这个py库大概也是这么个原理,但会有更多的格式校验。比如一般的”utf-8“格式就容易出现乱码,需要用”cp1252“;检查是否有相同的ID,数据场长度,信号值长度是否正常等等。

cantools还能通过dbc直接生成c代码,c代码可以用来对can报文进行decode和encode。它生成c代码的模板也是可以在源码中查看和修改。如果要实现dbc中周期性报文发送的c代码,某些报文的checksum值算法,rollingcounter值算法,也是可以用一样的原理来生成代码,模板自己写就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值