打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
CRC原来是这么回事!

CRC远没有网上所说那么简单。
  
  首先我们有一个数据流,也就是你需要校验的数据,可以是N BIT,一般我们常用的4,8,16,32,128 BIT,这里我取几个8的倍数,是因为我们的硬件以二进制为基础,所以在存取数据比较容易,无须充填位数来满足寄存器的要求。你用13,17,29 BIT也可以。

  有一点你要记住的是,你选用几个BIT,那么在CRC编码就需要移位几次,8就是移位8次,13就是移位13次,128就是移位128次。

我们看看目前为止的CRC的标准或者行规有:
CRC8  = X8+X5+X4+1 
CRC16 = X16+X15+X5+1 
CRC12 = X12+X11+X3+X2+1 
CRC32 = X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1 
   
CRC-CCITT=X16+X12+X5+1

需要说明的:CRC后所带的数字就是CRC的位数,它与你的数据流是无关的。

CRC8,8位CRC校验。
CRC16,16位CRC校验。
CRC12,12位CRC校验。
CRC32,32位CRC校验。
CRC-CCITT,16位CRC校验。

我们看到5个多项式,它的意义其实就是给出一个与数据流进行异或运算的初始值,
当然你可以更改这个值。比如:

CRC8  = X8+X5+X4+1 》》》 CRC8  = X7+X3+X2+1

CRC16 = X16+X15+X5+1 》》》CRC16 = X15+X5+1

只要你做出的东西是相互连接,不用与其他的机器对接,推荐保密部门使用该方法。
如果修改上述的多项式,那么别人在分析你传送来的数据时,该全部是错码。

补一下课:
 异或操作:
              RESULT
  0    0       0
  0    1       1
  1    0       1
  1    1       0
CRC8  = X8+X5+X4+1

X8 表示第7位需要异或运算
X5 表示第4位需要异或运算
X4 表示第3位需要异或运算
1  表示第0位需要异或运算

如图,首先将CRC所有位清0。
假设我们的数据流为8位,数据流 == 00000011,并且从0位(LSB)开始送入CRC中,则有:

1)1000 1 100
1)1100 1 010
0)0110 0 101
0)1011 1 110
0)0101 1 111
0)1010 0 011
0)1101 1 101
0)1110 0 010

我们看看这个数:
1110 0010 == 0XE2 --- 结果是错的
0100 0111 == 0X47 --- CRC

CRC16 = X16+X15+X5+1 

X16 表示第15位需要异或运算
X15 表示第14位需要异或运算
X5 表示第4位需要异或运算
1  表示第0位需要异或运算

如图,首先将CRC所有位清0。
假设我们的数据流为8位,数据流 == 00000011,并且从0位(LSB)开始送入CRC中,则有:

1)10000 1000000000 1 
1)01000 0100000000 0
0)00100 0010000000 0
0)00010 0001000000 0
0)00001 0000100000 0
0)00000 1000010000 0
0)00000 0100001000 0
0)00000 0010000100 0

CRC 
0001 0000 1000 0000 == 0X1080

CRC-CCITT=X16+X12+X5+1

比较特殊,所以再说说

CRC-CCITT 不同于 CRC-16在于它是个反相的CRC-16,所谓反相的意义指从第7位(MSB)开始移入CRC移位寄存器,

如图,首先将CRC所有位清0。
假设我们的数据流为8位,数据流 == 00000011,并且从7位(MSB)开始送入CRC中,则有:

0)00000  0000000  0000
0)00000  0000000  0000
0)00000  0000000  0000
0)00000  0000000  0000
0)00000  0000000  0000
0)00000  0000000  0000
1)10000  1000000  1000
1)11000  1100000  1100

CRC 
0011 0000 0110 0011 == 0X3063
1.预置1个16位的寄存器(下称CRC寄存器),初试化其内容为十六进制数0xFFFF;
2.把第一个待计算的数据即通讯信息帧的首字节与CRC寄存器的低8位相异或,把结果放回CRC寄存器;
3.把CRC寄存器的内容右移一位用0填补最高位即进行逻辑移位处理并检查右移后的移出位;
4.如果移出位为0重复第3步即再次右移一位,如果移出位为1则CRC寄存器与CRC生成多项式0xA001(1010 0000 0000 0001)进行异或运算,结果放回CRC寄存器;
5.重复步骤3和4,直到右移8次,对整个8位数据全部进行同样处理;
6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
7.将该通讯信息帧所有字节按上述步骤计算完成后,最后得到的CRC寄存器的内容即为CRC校验码,将其附着在原通讯信息帧后进行传输即可。如果用于Modbus协议设备则还需交换高低8位,非Modbus协议设备可以不必交换。接收方依同样方法进行计算,只是计算的内容不要包括最后两个字节,然后比较生成的CRC校验码和数据帧中的是否相同即可。如果发送方交换CRC校验码的高低8位,则接收方可以计算包括交换后的CRC码在内的整个数据帧,传输正确的话结果恒为0x0000。


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
三菱PLC实现CRC(循环冗余校验)计算程序,详细案例解析
循环冗余校验算法
CRC从原理到实现
200SMART如何编写CRC校验算法程序
【转】CRC16查表法中表格数据计算方法及实例
【S7-1200】 CRC校验原理以及梯形图的实现
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服