【问题标题】:CRC16 and data communicationsCRC16 和数据通信
【发布时间】:2013-05-09 03:29:32
【问题描述】:

您好,我一直在尝试为要为其编写软件接口的设备计算 CRC。为简单起见,我会说 X 是设备,Y 是硬件控制器。我正在寻找正确方向的推动我确信我在正确的轨道上只是在几点上有点困惑。

当设备处于空闲状态时,它每 2 秒左右发送以下数据字符串,看起来它正在以十六进制计数:| | 之间的 2 个字节是我假设的 CRC。 (XX) 是可变字节。

X: 96 10 01 E1 (E4) 01 FF 10 17 | F7 EC | 10 06 E1 96 FE X: 96 10 01 E1 (E6) 01 FF 10 17 | 7F FA | 10 06 E1 96 FE X: 96 10 01 E1 (E8) 01 FF 10 17 | C7 9B | 10 06 E1 96 FE X: 96 10 01 E1 (EA) 01 FF 10 17 | 4F 8D | FE 10 06 E1 96 FE X: 96 10 01 E1 (EC) 01 FF 10 17 | D7 B6 | FE 10 06 E1 96 FE X: 96 10 01 E1 (EE) 01 FF 10 17 | 5F A0 | FE 10 06 E1 96 FE

使用revengreveng -w 16 -s 以及我得到的上述数据集:

宽度=16 poly=0x1021 init=0x1e69 refin=true refout=true xorout=0x0000 check=0x3da6 name=(none)

当我拦截来自控制器的 a 命令时,我得到:

X: 96 10 01 E1 (EE) 01 FF 10 17 | 5F A0 | FE 10 06 E1 96 FE -- 命令前的最后一行 Y: E1 10 01 96 (22) 05 01 C0 A8 35 00 10 17 |0B B8| FE 10 06 96 E1 FE

其中 (22) 是修饰符 |0B B8| 是 CRC。 22是怎么从E4衍生出来的?是另一个 CRC 吗?

当我多次发送相同的命令时,我截获了以下内容:

Y: E1100196220501C0A8350010170BB8FE100696E1FE Y: E11001962A0501C0A835001017C1C7FE100696E1FE Y: E11001962E0501C0909400101753C8FE100696E1FE Y: E1100196300501809094001017C3EEFE100696E1FE Y: E1100196360501C090940010170D48FE100696E1FE Y: E11001962A0501C09094001017B6F7FE100696E1FE Y: E11001962A0501C09094001017B6F7FE100696E1FE

使用revengreveng -w 16 -s 以及我得到的上述数据集:

宽度=16 poly=0x1021 init=0xd313 refin=true refout=true xorout=0x0000 check=0x295f name=(none)

多项式是相同的,但 init 和 check 不同,对不起,很长的帖子,但这里是我的问题的摘要:

1) 说设备使用相同的多项式但不同的init并检查控制器是否常见?

2) 来自设备的常量计数字符串是否用于偏移用于计算校验和的可变字节?如果是这样,这种机制叫什么?可以使用什么方法来推导计数和字节之间的关系?

3) 我是在正确的轨道上还是迷路了?

感谢您花时间阅读本文,非常感谢您朝着正确的方向前进。

【问题讨论】:

  • 我不会这么认为。协议应定义两端使用的相同 CRC 参数。

标签: serial-communication crc16


【解决方案1】:

从你的 X 和 Y 序列中删除第一个字节,然后你会得到两者:

width=16  poly=0x1021  init=0xffff  refin=true  refout=true  xorout=0xffff  check=0x906e  name="X-25"

也就是说:

% reveng -w 16 -s 100196220501C0A8350010170BB8 1001962A0501C0A835001017C1C7 1001962E0501C0909400101753C8 100196300501809094001017C3EE 100196360501C090940010170D48 1001962A0501C09094001017B6F7 
width=16  poly=0x1021  init=0xffff  refin=true  refout=true  xorout=0xffff  check=0x906e  name="X-25"

% reveng -w 16 -s 1001E1E401FF1017F7EC 1001E1E601FF10177FFA 1001E1E801FF1017C79B 1001E1EA01FF10174F8D 1001E1EC01FF1017D7B6 1001E1EE01FF10175FA0
width=16  poly=0x1021  init=0xffff  refin=true  refout=true  xorout=0xffff  check=0x906e  name="X-25"

【讨论】:

  • DOH 是第一个字节,非常感谢,我会阅读有关 X-25 的信息,我想我应该可以从这里开始
  • 好的,你知道计数与下一个可变字节有什么关系吗?因为它计数 E4、E6、E8、EA、EC、EE,然后当控制器发送命令时变为 22。
  • 没有。如果我不得不猜测,我会说这是一个时间广播,其中那个字节以及之前的三个字节或之后的三个字节是某个时期之后的秒数。
猜你喜欢
  • 2014-11-27
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 2012-05-31
相关资源
最近更新 更多