【问题标题】:CRC-8 value mismatchCRC-8 值不匹配
【发布时间】:2020-06-04 13:21:59
【问题描述】:

我试图了解一个协议是如何工作的,它来自TEC-Microsystem device (DX5100),它说:

CRC:控制和CRC-8的字节。在某些选项中可能不存在 的协议。控制和 CRC-8 之前计算 填充整个数据包,从字节 FEND 开始, 以最后一个数据字节结束。如果一个数据包传输一个地址, 计算控制和时,使用其真值,即MSB=1 不予考虑。对于控制和的计算 使用多项式。 CRC = X8 + X5 + X4 + 1。

当我嗅探他们的软件发送的数据时,我看到这些数据正在传输:

0xC0 0x81 0x04 0x02 0x02 0x00 0x55

如果一个数据包传输一个地址, 计算控制和时,使用其真值,即MSB=1 不考虑

这意味着计算 CRC 所考虑的数据实际上是 0xC0 0x01 0x04 0x02 0x02 0x00(第二个字节是 0x01 而不是 0x81)。

根据我在维基百科上找到的内容,“CRC = X8 + X5 + X4 + 1”意味着他们使用“CRC-8-Dallas/Maxim”。

但是,当我使用 https://crccalc.com/ 时,输入 C00104020200 并点击“CALC-CRC-8”,它会报告“CRC-8/MAXIM”的 0x82,而不是 0x55。我错过了什么吗?

来自嗅探器的更多示例:

  • C0 81 03 02 02 00 D3,所以 C0 01 03 02 02 00 CRC 是 D3
  • C0 81 05 02 02 00 DA,所以 C0 01 05 02 02 00 CRC 是 DA

【问题讨论】:

  • 请注意,初始 CRC 设置为 0xDE,但我也无法匹配。您能否在您的问题中再添加一两个示例?
  • @rcgldr: "initial CRC is set to 0xDE",这是从哪里来的?
  • @rcgldr:在文档“在计算之前,数字 DEh 初始化值”中得到了 t......所以crccalc.com 可能无法提供帮助,因为无法指定。我会尝试嗅探另一个命令。
  • 试试这个计算器:online crc calculator。选择CRC8 MAXIM,然后点击“自定义”旁边的点来更改参数。
  • @rcgldr:这个链接很棒,但正如您评论的那样,我无法找到他们传输的相同 CRC。我添加了另外两个传输帧的示例。

标签: crc


【解决方案1】:

通过两个例子,你可以对它们进行异或,这样就消除了初始值和最终的异或,就好像两者都是00:

C0 01 03 02 02 00 CRC is D3
C0 01 05 02 02 00 CRC is DA
---------------------------
00 00 06 00 00 00 CRC is 09

这确认了 CRC 多项式是 0x31(反转为 0x8C),输入反映,结果反映。

使用初始值 0xDE 不起作用,因此我尝试将位反转为 0x7B,这适用于问题中的三个示例。所以初始值== 0x7B,多项式也会从0x31位反转到0x8C,但是在线计算器使用的是非反转多项式,0x31。如果单击“显示反射查找表”,计算 CRC,然后查看第 8 行字节 0,您将看到 0x8C。

【讨论】:

  • 谢谢你。我不明白 XOR 如何确认多项式是 0x31。但是您显然是对的,我尝试使用 boost CRC 库,boost::crc_basic<8>( 0x31, 0x7B, 0, true, true ) 为所有三个示例生成了良好的 CRC!
  • 此外,当设置了正确的选项时,您的在线生成器就会工作。这太棒了!
  • @jpo38 - 正如我的回答中提到的,这两种模式的异或消除了初始值和最终异或值,就好像它们是 0。这减少了多项式的变量数量,如果输入并反映结果,并且由于文档声明多项式为 0x31,因此与网站上的 CRC_MAXIM 匹配。
  • 好的,再次感谢您的帮助,我现在可以通过 boost 计算 CRC 并实现我想要的 wat!
猜你喜欢
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2012-07-24
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多