首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CRC16校验和: HCS08、Kermit和XMODEM

CRC16校验和: HCS08、Kermit和XMODEM
EN

Stack Overflow用户
提问于 2010-12-16 05:45:21
回答 3查看 18K关注 0票数 11

我正在尝试将CRC16错误检测添加到摩托罗拉HCS08微控制器应用程序中。不过,我的校验和不匹配。一个online CRC calculator既提供了我在PC程序中看到的结果,也提供了我在micro上看到的结果。

它将micro的结果称为"XModem“,将PC的结果称为”Kermit“。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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

下表显示了它们之间的区别:

代码语言:javascript
运行
复制
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-。有关更多信息,请参阅上面链接中对我博客帖子的更新。

票数 29
EN

Stack Overflow用户

发布于 2010-12-16 05:59:38

我的记忆(很久以前我曾经做过调制解调器的事情)是Kermit首先使用最低有效位处理数据的每个字节中的位。

大多数软件CRC实现(可能是Xmodem)首先遍历数据字节的最高有效位。

当查看用于链接到的CRC计算页面的库源文件(从http://www.lammertbies.nl/comm/software/index.html下载)时,您将看到XModem使用CRC16-CCITT,其多项式为:

代码语言:javascript
运行
复制
x^16 + x^12 + x^5 + 1  /* the '^' character here represents exponentition, not xor */

多项式由位图表示(请注意,位16是隐含的)

代码语言:javascript
运行
复制
0x1021 == 0001 0000 0010 0001  binary

Kermit实现使用:

代码语言:javascript
运行
复制
0x8408 == 1000 0100 0000 1000  binary

它与XModem的位图相同,只是相反。

该库附带的文本文件还提到了Kermit的以下区别:

仅针对CRC-Kermit和CRC -SICK的

:在所有输入处理之后,计算CRC的补码,并交换CRC的两个字节。

因此,修改CRC例程以匹配PC结果可能会很容易。请注意,CRC库中的源代码似乎有一个相当自由的许可证-或多或少地按原样使用它可能是有意义的(至少是应用程序的部分)。

票数 4
EN

Stack Overflow用户

发布于 2018-08-07 05:35:59

X-调制解调器1K CRC16。

使用输入数据{0x01,0x02}和多项式0x1021的字节CRC-16的处理

  1. 初始化crc =0
  2. 处理第一个输入字节0x01: 2.1‘异或’第一个输入字节0x01到MSB(!)of crc: 0000 0000 0000 (crc) 0000 0001 0000 0000 (输入字节0x01左移8)

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:目前我们有中间

  • = 0x1021 = 0001 0000 0010 0001。3.1 'Xor-in‘输入字节0x02到MSB(!)of crc: 0001 0000 0010 0001 (crc 0x1021) 0000 0010 0000 0000 (输入字节0x02左移8)

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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4455257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档