CRC16校验和:HCS08与Kermit对比XMODEM

Pot*_*ter 9 microcontroller checksum crc crc16

我正在尝试将CRC16错误检测添加到Motorola HCS08微控制器应用程序中.但是,我的校验和不匹配.一个在线CRC计算器提供了我在PC程序中看到的结果和我在微观上看到的结果.

它调用micro的结果"XModem"和PC的结果"Kermit".

这两个古老的协议指定使用CRC16的方式有什么区别?

and*_*oke 24

您可以使用相同的基本代码库实现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
Run Code Online (Sandbox Code Playgroud)

其中'反向字节'表示每个字节在处理之前进行位反转; '反向结果'表示16位结果在处理后进行位反转; 'swap result'表示结果中的两个字节在处理后交换.

所有上述内容均通过针对http://www.lammertbies.nl/comm/info/crc-calculation.html的测试向量进行了验证(如果错误,我们都会丢失......).

因此,在您的特定情况下,您可以通过对每个字节进行位反转,将位反转最终结果,然后在结果中交换两个字节,将XModem的代码转换为Kermit.

[我相信,但没有检查或计算出细节,反转每个字节相当于反转多项式(加上一些额外的细节).这就是为什么你会在不同的地方看到基本相同算法的不同解释.

此外,上述方法效率不高,但有利于测试.如果你想要有效率,最好的办法是将上面的内容翻译成查找表.

编辑上面我称之为CCITT的内容在RevEng目录中记录为CCITT-FALSE.有关详细信息,请参阅上面链接中我的博客文章的更新.