我正在尝试将CRC16错误检测添加到Motorola HCS08微 Controller 应用程序。我的校验和不匹配。一个online CRC calculator既提供了我在PC程序中看到的结果,又提供了在微型计算机上看到的结果。
它将微型程序的结果称为“XModem”,将PC的结果称为“Kermit”。
这两个古老协议(protocol)指定使用CRC16的方式有什么区别?
最佳答案
您可以使用相同的基本代码库来实现16位IBM,CCITT,XModem,Kermit和CCITT 1D0F。查看http://www.acooke.org/cute/16bitCRCAl0.html,它使用http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code中的代码
下表显示了它们之间的区别:
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-FALSE。有关更多信息,请参阅上面的链接上对我的博客文章的更新。
关于microcontroller - CRC16校验和: HCS08 vs. Kermit与XMODEM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4455257/