我正在尝试将CRC16错误检测添加到摩托罗拉HCS08微控制器应用程序中。不过,我的校验和不匹配。一个online CRC calculator既提供了我在PC程序中看到的结果,也提供了我在micro上看到的结果。
它将micro的结果称为"XModem“,将PC的结果称为”Kermit“。
这两个古老的协议指定使用CRC16的方式有什么不同?
发布于 2013-08-05 03:03:51
您可以使用相同的基本代码库实现16位IBM、XModem、Kermit和CCITT1D0F。请参阅使用http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code中的代码的http://www.acooke.org/cute/16bitCRCAl0.html
下表显示了它们之间的区别:
name polynomial initial val reverse byte? reverse result? swap result?
CCITT 1021 ffff no no no
XModem 1021 0000 no no no
Kermit 1021 0000 yes yes yes
CCITT 1D0F 1021 1d0f no no no
IBM 8005 0000 yes yes no
其中“反向字节”表示每个字节在处理前被位反转;“反转结果”表示16位结果在处理后被位反转;“交换结果”表示结果中的两个字节在处理后被交换。
以上所有内容都通过http://www.lammertbies.nl/comm/info/crc-calculation.html测试向量进行了验证(如果这是错误的,我们都会迷失...)。
因此,在您的特定情况下,可以通过位反转每个字节,位反转最终结果,然后交换结果中的两个字节,将XModem的代码转换为Kermit。
[我相信,但没有检查或解决细节,颠倒每个字节等同于颠倒多项式(加上一些额外的细节)。这就是为什么你会在不同的地方看到非常不同的解释,对于基本上相同的算法。
此外,上面的方法效率不高,但对测试很好。如果你想提高效率,最好的办法就是把上面的代码转换成查找表。]
CCITT编辑错误在RevEng catalogue中记录为CCITT-。有关更多信息,请参阅上面链接中对我博客帖子的更新。
发布于 2010-12-16 05:59:38
我的记忆(很久以前我曾经做过调制解调器的事情)是Kermit首先使用最低有效位处理数据的每个字节中的位。
大多数软件CRC实现(可能是Xmodem)首先遍历数据字节的最高有效位。
当查看用于链接到的CRC计算页面的库源文件(从http://www.lammertbies.nl/comm/software/index.html下载)时,您将看到XModem使用CRC16-CCITT,其多项式为:
x^16 + x^12 + x^5 + 1 /* the '^' character here represents exponentition, not xor */
多项式由位图表示(请注意,位16是隐含的)
0x1021 == 0001 0000 0010 0001 binary
Kermit实现使用:
0x8408 == 1000 0100 0000 1000 binary
它与XModem的位图相同,只是相反。
该库附带的文本文件还提到了Kermit的以下区别:
仅针对CRC-Kermit和CRC -SICK的
:在所有输入处理之后,计算CRC的补码,并交换CRC的两个字节。
因此,修改CRC例程以匹配PC结果可能会很容易。请注意,CRC库中的源代码似乎有一个相当自由的许可证-或多或少地按原样使用它可能是有意义的(至少是应用程序的部分)。
发布于 2018-08-07 05:35:59
X-调制解调器1K CRC16。
使用输入数据{0x01,0x02}和多项式0x1021的字节CRC-16的处理
0000 0001 0000 0000 = 0x0100这个结果的MSB是我们当前的除法: MSB(0x100) = 0x01。2.2所以0x01是除数。从我们的表中获取divident的余数: crctable160x01 = 0x1021。(这个值是来自上面手动计算的Famila值。)记住,当前的CRC值是0x0000。移出当前crc的MSB,并将其与当前余数进行异或,得到新的CRC: 0001 0000 0010 0001 (0x1021) 0000 0000 0000 (CRC 0x0000左移8= 0x0000)
0001 0000 0010 0001 = 0x1021 =中间crc。
CRC句柄下一个输入字节0x02:目前我们有中间
0001 0010 0010 0001 = 0x1221此结果的MSB是我们的当前除数: MSB(0x1221) = 0x12。3.2所以0x12是除数。从我们的表中获取divident的余数: crctable160x12 = 0x3273。记住,当前的CRC值是0x1021。移出当前crc的MSB,并将其与当前余数进行异或,得到新的CRC: 0011 0010 0111 0011 (0x3273) 0010 0001 0000 0000 (CRC 0x1021左移8= 0x2100)
0001 0011 0111 0011 =0xStandard=最终crc。
https://stackoverflow.com/questions/4455257
复制相似问题