基本概念看这篇文章详述循环冗余校验CRC(C代码)_crc循环冗余校验-优快云博客
CRC模型计算举例看这篇文章最详细的“CRC码原理详解”-优快云博客
有一些疑点,CRC16_ModBus的计算代码是如何通过CRC原理得出的,为什么8005要变成A001,里面的逻辑是什么?如果要自己用代码实现其他CRC计算模型,应该如何编写程序?私以为能搞清原理和代码之间的关系才算真正理解了CRC校验。
还有为什么原始数据必须是以字节为单位。
下面我将补充一些其他CRC模型计算的实例,加深对CRC原理及应用的理解。
补充2字节计算情况:

43 67 即 0100 0011 0110 0111,采用CRC-5/USB(G(x) = x^5 + x^2 + 1)多项式。
s1:根据CRC-5/USB多项式,得到除数二进制:100101
s2:由于REFIN=TRUE,需要翻转输入数据,0100 0011 0110 0111 是直接翻转成 1110 0110 1100 0010 还是按字节翻转成1100 0010 1110 0110,经计算验证,是后者。
s3:由于INIT=0x1F为全1,需要对s2中数据的前CRC位数(高位)(即5-bit)和CRC初值进行异
或,得到数据:1100 0010 1110 0110 -> 0011 1010 1110 0110
s4:将s3中的数据的最低位补5位0,得到数据:0011 1010 1110 0110 00000
s5:将s4中的数据与多项式二进制(100101),进行模2除法运算

得到余数:10000
s6:由于REFOUT=TRUE,需要将s5中的结果(10000)进行翻转,得到数据:10000—>00001
s7:最后,s6中的值与XOROUT=0x1F进行异或,得到最终的CRC值:11110 即1E
补充3字节时 CRC16_MODBUS模型的计算情况:

计算过程

异或运算网站:
crc计算网站:
ModbusCRC16计算单字节及crc模型详细计算过程:
关于各个CRC模型与代码的关系,后续找到了这篇文章可以参考:
1098

被折叠的 条评论
为什么被折叠?



