蛮力或计算串行 RS232 校验和

Brute Force or Calculate Serial RS232 Checksums

我正在通过引导加载程序与控制面板通信,并且捕获了一些串行数据。它看起来采用修改后的 API 格式,每个命令的开头和结尾都是 7E

我似乎无法确定 CRC 是如何计算的。基于 API 格式,第一个字节构成消息,第二个和第三个字节是消息的长度,第四个字节看起来是命令的类型。接下来的几个字节是数据地址或请求的内容,倒数第三个字节和倒数第二个字节看起来是校验和,最后一个字节包含 7E 以关闭帧。

我找到了一些其他帖子,这些帖子是用 docklight 脚本回答的,该脚本使用一些标准的 CRC 类型强制执行 CRC,但这些脚本不适用于我的数据。

下面的一些示例消息

对引导加载程序的查询:

7e  07  00  0d  24  12  7f  00  40  00  e1  3b  7e
7e  07  00  1a  00  d0  3e  00  70  00  ad  3d  7e
7e  01  00  1f  0e  18  7e
7e  07  0   0d  34  00  7f  00  04  00  9f  fa  7e
7e  0a  00  18  00  00  00  00  00  00  80  7b  00  83  c0  7e

引导加载程序的响应(随机,这些不是基于上述查询的响应)

7e 41 00 85 0b 03 03 03 04 00 03 03 00 03 00 00 07 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 45 9e 7e

7e 05 00 85 da 8c 66 01 e3 ce 7e

有人有什么建议吗?

编辑 2021 年 11 月 2 日

下面是一些附加信息。

 7e 0a 00 18 00 00 80 00 00 00 00 01 00 c6 47 7e   ~.....€......ÆG~ 
 7e 0a 00 18 00 00 00 00 00 00 80 7b 00 83 c0 7e   ~.........€{.ƒÀ~ 

These Commands appear to use
Polynomial: 1021
Initial Value: 2241
Final Xor: 0
Refin = True
RefOut= True
CRC Data Length = 12 Bytes


7e 07 00 0d 00 6a 4e 00 00 08 99 7b 7e            ~....jN...™{~    
7e 07 00 0d 00 72 4e 00 90 00 ec 00 7e            ~....rN..ì.~    
7e 07 00 0d 34 00 7f 00 04 00 9f fa 7e            ~...4....Ÿú~    
7e 07 00 0d 24 12 7f 00 40 00 e1 3b 7e            ~...$..@.á;~    
7e 07 00 1a 00 d0 3e 00 70 00 ad 3d 7e            ~....Ð>.p.­=~    
7e 07 00 0d 00 5a 4e 00 00 08 48 af 7e            ~....ZN...H¯~    
7e 07 00 0d 00 62 4e 00 00 08 b9 21 7e            ~....bN...¹!~    

These Commands appear to use
Polynomial: 1021
Initial Value: 0daa
Final Xor: 0
Refin = True
RefOut= True
CRC Data Length = 9 Bytes
  
7e 02 00 14 00 b6 fd 7e   ~....¶ý~ 
7e 02 00 14 01 3f ec 7e   ~....?ì~ 
7e 02 00 14 02 a4 de 7e   ~....¤Þ~ 
7e 02 00 14 03 2d cf 7e   ~....-Ï~ 
7e 02 00 14 04 92 bb 7e   ~....’»~ 
7e 02 00 14 05 1b aa 7e   ~.....ª~ 
7e 02 00 14 06 80 98 7e   ~....€˜~ 
7e 02 00 14 07 09 89 7e   ~.....‰~ 
7e 02 00 14 08 fe 71 7e   ~....þq~ 
7e 02 00 14 09 77 60 7e   ~....w`~ 
7e 02 00 14 0a ec 52 7e   ~....ìR~ 
7e 02 00 14 0b 65 43 7e   ~....eC~ 
7e 02 00 14 0c da 37 7e   ~....Ú7~ 
7e 02 00 14 0d 53 26 7e   ~....S&~ 
7e 02 00 14 0e c8 14 7e   ~....È.~ 
7e 02 00 14 0f 41 05 7e   ~....A.~ 
7e 02 00 14 10 37 ed 7e   ~....7í~ 
7e 02 00 14 11 be fc 7e   ~....¾ü~ 
7e 02 00 14 12 25 ce 7e   ~....%Î~ 
7e 02 00 14 13 ac df 7e   ~....§~ 
7e 02 00 14 14 13 ab 7e   ~.....«~ 
7e 02 00 14 15 9a ba 7e   ~....šº~ 

These Commands appear to use
Polynomial: 1021
Initial Value: 90F8
Final Xor: 0
CRC Data Length = 4 Bytes

因此,用于计算 CRC 的初始值根据消息长度而变化,不包括帧字节 7e 和开始和结束,以及 2 个 CRC 字节。

我想我可以尝试发送一些导致不同消息长度的请求,并使用该方法计算 CRC,直到我认为我需要的任何消息大小。

您需要在 CRC 计算中不包括前两个字节(长度)。然后你会发现初始值为0xffff,最后异或为0xffff.