crc 校验错误_CRC-8和CRC-16算法

​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格式,对应平时说的小端和大端。当然,这两种编码格式,没有任何优劣之分,完全是设计者的习惯问题。有了这两种编码形式,在解析

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值