赞
踩
1 什么是CRC校验
CRC8校验在整车通信系统中应用比较广泛,相当于以前XOR(异或)的升级版,今天介绍下CRC8的校验算法。
当我们要发送报文信息时,为了避免传输过程的干扰,一般会在8字节的CAN报文中,增加Rolling counter和Checksum校验。Rolling counter 校验,即滚动计数,是为了发现丢帧和漏帧情况,原理很简单,就是从0-15滚动计数,当接收的Rolling counter 和自己计算的counter相等或相差2以上,那就可以判断帧未对齐,或有丢帧、漏帧现象。例如,Rolling counter代码可以这么写:
- if ( RollingCounter < 15)
- {
- RollingCounter ++;
- }
- else
- {
- RollingCounter = 0;
- }
Checksum,校验和,是为了发现同一时刻是否有错帧的情况,可以有效地降低数据的错误率。而我们提到的CRC8校验算法,就是对一帧报文进行校验和计算的算法。
参考CRC源码的同学,请关注【汽车控制与人工智能】微信公众号,后台回复【CRC】获取。
2 CRC8的原理
在发送节点,根据要传送的m位二进制码序列,以一定的规则(CRC校验有不同的规则,在差错控制理论中称为“生成多项式”)产生一个校验用的n位校验码(CRC码),附在原始报文中(一般在报文的最后位置),构成一个新的二进制码序列数共m+n位,然后发送出去。在接收节点,根据报文信息和CRC码之间遵循的规则(即与发送时生成CRC校验码相同的规则)进行检验,校验采用计算机的模二除法(即生成多项式)做异或运算,进行异或运算时除数和被除数最高位对齐,进行按位异或运算,若最终的数据能被除尽,则传输正确;否则,传输错误。
CRC8即最终生成的CRC校验码为1字节,其生成多项式,生成多项式为g(x)=x^8+x^5+x^4+1,相当于g(x)=1·x^8+0·x^7+0·x^6+1·x^5+1·x^4+0·x^3+0·x^2+0·x^1+1·x^0,即对应的二进制数为100110001。
CRC8标准生成多项式
CRC-8:x^8+x^5+x^4+1 0x31 (0x131)
CRC-8:x^8+x^2+x^1+1 0x07 (0x107)
CRC-8:x^8+x^6+x^4+x^3+x^2+x^1 0x5E (0x15E)
由于多项式的最高为都为1,并且在代码的CRC8计算中,最高位也是不使用的, 所以在多项式记录时都去掉了最高位。
3 报文的编码格式
计算CRC8之前,还得介绍下报文的编码格式。报文的编码格式分为Intel格式与Motorola格式,对应平时说的小端和大端。当然,这两种编码格式,没有任何优劣之分,完全是设计者的习惯问题。有了这两种编码形式,在解析报文前
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。