串行RS232通信校验和?

时间:2015-04-24 15:05:14

标签: serial-communication

我通过RS232串口与伺服器通信。伺服附带的内置功能太慢(57,600波特端口上的简单54字节消息为25 ms),因此我尝试编写自己的通信功能,但内置功能没有记录。我使用端口监视器来确定发送到伺服的信息,我需要帮助解密结果。 我使用内置函数命令伺服到"转到"逐步增加步骤(1,2,3等)。这导致5个数据包被发送到每个" goto"命令。前4个数据包对于每个" goto"命令。我在下面附上了大约50个十六进制数据包(每行1个)。如果你需要更多,发布,我们可以解决一些问题。

10 13 04 20 00 01 B6 24 E9 68 10 13 04 20 00 00 AE 24 54 82 10 13 04 20 00 00 B5 24 8B 0B 10 13 04 20 00 01 43 01 71 9B

第5个数据包根据电机命令移动的步骤而变化。我在这里包含了一个数据包作为例子。我附加了一个包含大约1000个数据包的文件(每行1个)。

10 13 08 20 03 01 11 25 0A 00 00 00 81 CF

此数据包的前8个字节(10 13 08 20 03 01 11 25)似乎是实际的" goto"命令。无论指定什么步骤,它们都保持不变。 最后6个字节(0A 00 00 00 81 CF)根据请求的步骤而变化。在我附上的文件中,我指示伺服最初转到步骤" 0",然后" 1"," 2"等等。前4个字节出现在是一个对应于步数的小端整数(即上面显示的样本命令指示伺服转到步骤10的十进制)。 我的问题是关于命令的最后2个字节。它们似乎随机变化,但只要指定的步骤相同,它们就会匹配。这让我相信这两个字节是某种校验和。我的问题是:如何计算校验和? 我已经尝试过单独和2字节对中的所有字节,我尝试了Fletcher的校验和,以及一个简单的校验和(所有字节的总和)。我还检查了每种方法的2个补码(虽然我当然不会介意有人检查以确保我在计算中没有犯错)。有没有人有任何想法?

10 13 08 20 03 01 11 25 00 00 00 00 E9 64

10 13 08 20 03 01 11 25 01 00 00 00 9F D0

10 13 08 20 03 01 11 25 02 00 00 00 04 0C

10 13 08 20 03 01 11 25 04 00 00 00 23 95

10 13 08 20 03 01 11 25 05 00 00 00 55 21

10 13 08 20 03 01 11 25 06 00 00 00 CE FD

10 13 08 20 03 01 11 25 07 00 00 00 B8 49

10 13 08 20 03 01 11 25 08 00 00 00 6C A7

10 13 08 20 03 01 11 25 09 00 00 00 1A 13

10 13 08 20 03 01 11 25 0A 00 00 00 81 CF

10 13 08 20 03 01 11 25 0C 00 00 00 A6 56

10 13 08 20 03 01 11 25 0D 00 00 00 D0 E2

10 13 08 20 03 01 11 25 0F 00 00 00 3D 8A

10 13 08 20 03 01 11 25 10 10 00 00 00 17 FA

10 13 08 20 03 01 11 25 11 00 00 00 84 77

10 13 08 20 03 01 11 25 12 00 00 00 1F AB

10 13 08 20 03 01 11 25 13 00 00 00 69 1F

10 13 08 20 03 01 11 25 14 00 00 00 38 32

10 13 08 20 03 01 11 25 15 00 00 00 4E 86

10 13 08 20 03 01 11 25 16 00 00 00 D5 5A

10 13 08 20 03 01 11 25 17 00 00 00 A3 EE

10 13 08 20 03 01 11 25 18 00 00 00 77 00

10 13 08 20 03 01 11 25 19 00 00 00 01 B4

10 13 08 20 03 01 11 25 1A 00 00 00 9A 68

10 13 08 20 03 01 11 25 1B 00 00 00 EC DC

10 13 08 20 03 01 11 25 1C 00 00 00 BD F1

10 13 08 20 03 01 11 25 1D 00 00 00 CB 45

10 13 08 20 03 01 11 25 1E 00 00 00 50 99

10 13 08 20 03 01 11 25 1F 00 00 00 26 2D

10 13 08 20 03 01 11 25 20 00 00 00 DE 2A

10 13 08 20 03 01 11 25 21 00 00 00 A8 9E

10 13 08 20 03 01 11 25 22 00 00 00 33 42

10 13 08 20 03 01 11 25 24 00 00 00 14 DB

10 13 08 20 03 01 11 25 25 00 00 00 62 6F

10 13 08 20 03 01 11 25 26 00 00 00 F9 B3

10 13 08 20 03 01 11 25 27 00 00 00 8F 07

10 13 08 20 03 01 11 25 28 00 00 00 5B E9

10 13 08 20 03 01 11 25 29 00 00 00 2D 5D

10 13 08 20 03 01 11 25 2A 00 00 00 B6 81

10 13 08 20 03 01 11 25 2B 00 00 00 C0 35

10 13 08 20 03 01 11 25 2C 00 00 00 91 18

10 13 08 20 03 01 11 25 2D 00 00 00 E7 AC

10 13 08 20 03 01 11 25 2E 00 00 00 7C 70

10 13 08 20 03 01 11 25 2F 00 00 00 0A C4

10 13 08 20 03 01 11 25 30 00 00 00 C5 8D

10 13 08 20 03 01 11 25 31 00 00 00 B3 39

10 13 08 20 03 01 11 25 32 00 00 00 28 E5

10 13 08 20 03 01 11 25 33 00 00 00 5E 51

10 13 08 20 03 01 11 25 34 00 00 00 0F 7C

10 13 08 20 03 01 11 25 35 00 00 00 79 C8

10 13 08 20 03 01 11 25 36 00 00 00 E2 14

10 13 08 20 03 01 11 25 37 00 00 00 94 A0

10 13 08 20 03 01 11 25 38 00 00 00 40 4E

10 13 08 20 03 01 11 25 39 00 00 00 36 FA

10 13 08 20 03 01 11 25 3A 00 00 00 AD 26

10 13 08 20 03 01 11 25 3B 00 00 00 DB 92

10 13 08 20 03 01 11 25 3C 00 00 00 8A BF

10 13 08 20 03 01 11 25 3D 00 00 00 FC 0B

10 13 08 20 03 01 11 25 3E 00 00 00 67 D7

10 13 08 20 03 01 11 25 3F 00 00 00 11 63

1 个答案:

答案 0 :(得分:1)

这是一个迟到的答案,但希望这可以帮助其他CRC重新设计任务:

您的CRC是CCITT"所指定的所谓" 16位宽CRC的推导,但是"初始值为零"。

CRC是从示例数据的字节位置3到字节位置12计算的。例如

08 20 03 01 11 25 00 00 00 00

根据我们CRC specification overview的完整CRC规范是:

CRC:16,1021,0000,0000,No,No

问题不仅在于找到正确的CRC多项式,而且找到以下答案:

  • CRC计算中包含哪部分数据,哪部分不包括在内。
  • 使用哪个init值?应用最终xor值?
  • 此算法是否需要反映输入或输出值?

再次,请参阅我们的手册说明或Boost CRC library这意味着什么。

我所做的是运行一个蛮力脚本,它只是尝试几种流行的16位CRC多项式,包括开始/结束位置,初始值,反射版本的各种组合。以下是处理输出的外观:

 Finding CRC for test message (HEX): 10 13 08 20 03 01 11 25 00 00 00 00 E9 64
 Trying CRC spec : CRC:16,1021,FFFF,0000,No,No
 Trying CRC spec : CRC:16,8005,0000,0000,No,No
 Trying CRC spec : CRC:16,8005,FFFF,0000,No,No
 Trying CRC spec : CRC:16,1021,FFFF,FFFF,No,No
 Trying CRC spec : CRC:16,1021,0000,FFFF,No,No
 Trying CRC spec : CRC:16,1021,0000,0000,No,No
 Found it!
 Relevant sequence for checksum from startpos=3 to endpos=12
 08 20 03 01 11 25 00 00 00 00
 CRC spec:   CRC:16,1021,0000,0000,No,No
 CRC result: E9 64 (Integer = 59748)

结果我可以正确地重新计算你的示例电报的校验和

19.09.2016 12:18:12.764 [TX] - 10 13 08 20 03 01 11 25 00 00 00 00 E9 64 
19.09.2016 12:18:14.606 [TX] - 10 13 08 20 03 01 11 25 01 00 00 00 9F D0 
19.09.2016 12:18:16.030 [TX] - 10 13 08 20 03 01 11 25 02 00 00 00 04 0C 

我上传了记录的CRC finder example script,其中包含免费Docklight Scripting V2.2评估。我认为这对其他CRC重新设计难题也非常有用。

该示例还有助于解决Stackoverflow question 22219796