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.有关详细信息,请参阅上面链接中我的博客文章的更新.
| 归档时间: |
|
| 查看次数: |
14112 次 |
| 最近记录: |