CRC校验算法——以CRC8(X^8+X^2+X+1)为例

前言

RM裁判系统串口通信的帧头用了CRC8校验,借此机会研究了一下CRC校验的原理。
本文以上述帧头作为例子,讲解CRC8(X8+X2+X+1)校验码的生成方法。

帧头定义如图所示:帧头详细定义
由图可知:
帧头的数据位总共是4个字节,即32bit;
校验位是1个字节,即8bit。
要从这4字节的数据位生成1字节的CRC校验码。

步骤

设数据位如下:
1.起始字节:0xA5
2.数据长度:0x0002
3.包序号:0x01
连起来就是:
A5000201(Hex) = 10100101 00000000 00000010 00000001(Bin)

总的来说CRC码生成过程就两步:
1.向左移位
2.模2除法(后面细讲)

这里面要确定2个量:
1.左移的位数
2.模2除法时的除数

使用该链接提供的CRC计算器计算得到A5000201的CRC8校验码为0x9C=10011100(Bin)
所以,下面的计算过程将详细解释如何得到这个校验码。

步骤1:向左移位

该校验码为8位,因此移位位数=8
向左移8位,得到
10100101 00000000 00000010 00000001 00000000(Bin)
=
A500020100(Hex)

步骤2:模2除法

步骤1中移位后的数据位除以一个常数
本例中的常数为0x107。
即用0xA500020100除以0x107。
模2除法也是除法的一种。
事实上,每一种CRC校验码都有一个对应的常数作为除数。如下表所示:
最右边一列为除数。
CRC码除数表
下面是模2除法的过程:
模2除法的规则简单来说,就是,
被除数最高位是1,商就是1;最高位是0,商就是0。
设被除数为A(不是指完整的被除数,而是做竖式运算时的8bit数),
商X除数=B(A和B均为8bit数)
则每次用A减去B时(和普通除法竖式运算一样,这一步是为了得到余数),使用不带进位的二进制减法——等价于将A和B异或
如果没看懂可以看百度百科百度百科
笔算过程
其余的操作和普通除法竖式运算一样。
模2除法运算最终得到一个8bit的余数。这个余数就是我们所求的CRC校验码。
本例中求得的CRC码=0x9C=10011100(Bin)

这里再贴一个模2除法的例子:
例子

CRC码生成算法代码

待更

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值