文章目录
前言
1、现在很多的车厂对于车辆的安全机制非常重视,车厂通过对发送的CAN数据进行加密而形成一种保护机制,而Checksum和Counter是其中的一种保护介质,当CAN报文数据的Checksum和Counter正确,才能正常发送与接收。
一、关于Checksum的组成形式
1、车载行业上CAN报文应该有两种携带Checksum的方式,一种是一条报文一个Checksum;另外一种是一个信号组对应一个Checksum,即一条报文多个Checksum,像上汽、吉利、华人运通等都有这种Checksum机制,或者不戴~~;
二、自定义的Checksum方法一
注:我已经成功使用过两种方法发送Checksum,但软件都是通过Veristand去发送;
方法一:通过Veristand自带的AFP(Automatic Frame Processing)功能添加自定义算法文件,这个方法我是参考师子一号文章实现的(仅限于一条报文一个Checksum):
参考文献:点击跳转文章
这种方法有局限性,原因:支持的算法文件容量太小,感觉是分配给AFP功能的算力太小了,我大概写了120行算法,无法部署到实时机,但是如果是一个报文一个Checksum还是可以拿来用的,毕竟代码量不会大。
1、实现的主要流程图如下:
2、方法一的主要算法参考
注意:(最后一句代码是最关键)
①a_pDataFrame->Payload[31] = CRCLowByte,这是将算好的Chcksum填入对应的Playload;
②*a_pDataFrame->Payload[31]表示获取当前报文的第31个字节数据;
char buf[11];
unsigned int byte;
unsigned char k;
unsigned short ACC,TOPBIT;
unsigned short remainder = 0x00;
unsigned short CRCLowByte;
int len=10;
//根据dbc自己解析
//通过a_pDataFrame->Payload[0] 获取当前报文第一个字节数据,获取第二个字节数据类似。
buf[0] = 0x74;
buf[1] = 0x00;
buf[2] = a_pContextData[2]-1;
buf[3] = (a_pDataFrame->Payload[35] >> 5)& 0x07;
buf[4] = (a_pDataFrame->Payload[35] >> 2)& 0x03;
buf[5] = a_pDataFrame->Payload[32] & 0x0F;
buf[6] = (a_pDataFrame->Payload[33] >> 4) & 0x0F;;
buf[7] = a_pDataFrame->Payload[35] & 0x01;
buf[8] = a_pDataFrame->Payload[33] & 0x0F;
buf[9] = (a_pDataFrame->Payload[34] >> 4) & 0x0F;
buf[10] = a_pDataFrame->Payload[34] & 0x0F;
//CRC算法
TOPBIT = 0x80;
for (byte = 0; byte <= len; ++byte)
{
ACC = buf[byte];
remainder ^= ACC;
for (k = 8; k > 0; --k)
{
if (remainder & TOPBIT)
{
remainder = (remainder << 1) ^0x1D;
}
else
{
remainder = (remainder << 1);
}
}
}
remainder=remainder^0x00;
CRCLowByte=remainder & 0x00FF;
//将算好的Checksum放在对应的playload,我这里的Checksum在第31个字节;
a_pDataFrame->Payload[31] = CRCLowByte;
三、自定义的Checksum方法二
方法二:我目前在用的就是方法二,相当于重新创建一个Custom Device,这个CD支持报文的完全处理,是一个完整的CAN处理模块,不过这个方法需要下载的东西比较多,请耐心下载,不要被劝退了,这个方法很有用,自定义程度很高,更改里面的逻辑需要Labview基础;
点击下载Checksum校验的Custom Device demo
1、软件及插件下载;
1、通过制作Veristand的Custom device重定义CAN模块,请逐条下载;
1) NI Package Manager----NI官网下载
2)Labview 2020 ----NI官网 or NI Package Manager下载
3)Veristand 2020 R5 ----NI官网 or NI Package Manager下载
4)NI XNET 19 or later ----NI官网 or NI Package Manager下载
安装完成Labview会有这个VI Package Manager下载工具
5)NI Simple Messaging Library 3.1.0.9 —VI Package Manager下载
6)NI Asynchronous Messaging Communication Library 3.3.1.22—VI Package Manager下载
7)NI Veristand Custom Device Development Tools,如下图逐个下载安装;
https://github.com/ni/niveristand-custom-device-development-tools/releases
以上7个是插件和软件,下载安装完成才能代开下面的Custom device工程;
2、Custom device的使用;
1、打开Custom device 工程;
2、打开工程之后的界面,打开CAN报文处理VI(如果有错误就是插件没下载够)
3、CAN报文处理VI介绍;
以下3个VI分别处理Counter、Checksum、playload(报文字节);
3.1 双击Checksum处理VI(Update Protection Signals.vi),再双击进入Checksum算法;
3.2 进入Checksum算法VI(Calculate Protection Value.vi),添加算法的名称,到时候在Veristand会有体现;
3.3 添加算法分支与模块(前提是先添加上一步骤的算法名称);
综上是Checksum算法的添加方法,算法自己写呗,因为每个项目的算法基本都不一样;
4、添加完算法之后,就是编译Custom Device工程了;
4、Veristand调用Custom Device;
4.1 新建一个工程,右键项目,进入系统配置;
4.2 新建一个CD
4.2.1选择数据库
4.3 导入帧到Outgoing中的Cyclic(周期发送帧);
4.4 配置报文的Counter;
4.4.1 右键某个信号 Make Counter Signal
4.4.2 填写Counter的最大值(发送报文时会自动计算0~最大值)
4.5 配置报文Checksum–这里以信号组情况实列;
4.5.1 添加Checksum
4.5.2 配置Checksum页面的参数;
4.5.3 选择需要参与计算的信号(哪些信号值要参与Checksum的运算,选择后在Labview算法处可以调用相关的参数);
4.5.4 导入之后,当发送这帧报文时,会传入上面添加的Select Channels中选择的数据库数据,在下图中Labview模块调用,所以做算法的时候要合理运用;
5、Veristand发送信号值;
6、部署到实时机;
部署到实时机之后就可以发送报文啦
综上,完成Veristand发送自定义Checksum的方法,整体的思路都在这里;