• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

☆☆☆☆☆-----请高手帮忙分析一组串口间通讯数据的校验方式 -----☆☆☆☆☆

问题概述:从一部小机器上读到几串数据,已经分析出后两位为校验码,但不清楚是用什么原理做的校验?特请大家帮忙分析校验码是通过什么算法得到.

测试环境:一部小机器内部有三块单片机(为A机,B机,C机,其中A机已知是主机,且A机为发送端,B机和C机是接收端),通讯方式采用232串口.通过机器上的设置按钮可以改变主机A的发送参数,现在可以把主机A发送的数据截获下来,已经分析出每串数据的后两位为校验码.但就是不清楚其采用什么样的校验方式?

主机A----发给B机的数据(通过修改机器某个参数(对应下面数据的第2位)为8个不同的值,截获的8次不同发送数据)
:C1420000D80000000200000000000000000000A7
:C2420000D80000000200000000000000000000A6
:C3420000D80000000200000000000000000000A5
:C4420000D80000000200000000000000000000A4
:C5420000D80000000200000000000000000000A3
:C6420000D80000000200000000000000000000A2
:C7420000D80000000200000000000000000000A1
:C8420000D80000000200000000000000000000A0

主机A----发给C机的数据(通过修改机器某个参数(对应下面数据的第4位)为3个不同的值,截获的3次不同发送数据)
:E000000901010000007F
:E001000901010000007E
:E002000901010000007D
主机A----发给C机的数据(通过修改机器另一个参数(对应下面数据的第8位)为3个不同的值,截获的3次不同发送数据)
:E0000001010100000087
:E0000002010100000086
:E0000008010100000080
-----------------------------------------------------------------------------------------------------------------------------------------
下面主要是B机和C机返回给A机的数据,(由于这些数据实时都在变化,且较长,怕影响大家的思路,故开始没有介绍,)
对整个系统为半双工通信,下面是A机发送数据后收到从B机和C机返回的数据,由于B机和C机发给A主机的数据比较复杂,主要是许多路电压和电流方面的数据,并且随时都在变化(AD采集的结果都会时刻变化)下面的数据只是"某个时刻"的截获数据,

B机返回给A机的数据::(某时刻截获的返回给A机的3组数据,每组的最后两位为校验码)
:C0D0080100000041749F780E747F6F776EDF6DFCD0E3D51F001F001F00400040004000807F7F807F7F0E3200B0E0000360005F005F00006E32F300F200F20000020808080000000000FB00FC00000000000000000000000000000000000000000000E63096
:C1D008010000003A74AF782074876F7A6EDF6DF8D0DED51F001F001F00400040004000807F7F807F7F0E3200B0E000035F005F005F00006E32F300F200F20000020808080000000000FB00FC00000000000000000000000000000000000000000000E6307B
:C2D008010000003B7487781B747C6F7C6EDC6DFBD0EAD51F001F001F004000400040007F7F7F807F7F0E3200B0E0000360005F005F00006E32F300F200F20000020808080000000000FB00FC00000000000000000000000000000000000000000000E63070

C机返回给A机的数据:(某时刻截获的返回给A机的3组数据,每组的最后两位为校验码)
:E0E00100506D286E006F10747077E8744C324C320000000000004000000000000000000000000000000000000000000000102E
:E0E00100286E286E006F10747877E87447324C3200000000000040000000000000000000000000000000000000000000001034
:E0E00100506D506D006F38739876E8744C324C3200000000000040000000000000000000000000000000000000000000001022
全部回复(5)
正序查看
倒序查看
mckeeqin
LV.1
2
2009-01-04 12:41
不是CRC,也不是累加和,常用的校验方式都试过,都不行啊
0
回复
whatcall
LV.5
3
2009-01-04 18:15
@mckeeqin
不是CRC,也不是累加和,常用的校验方式都试过,都不行啊
我觉得可以肯定是一种计算累加和的一种方式(但是最后的校验字节是和的补码).从你列的所有数据来看,都符合这个规律,比如:

:C1420000D80000000200000000000000000000A7
:C2420000D80000000200000000000000000000A6

C1增加为C2,A7则减小到A6.

其余两种数据也一样,并且这两种之间的第一组中校验码钱的字节和差8(09->01 ),校验码从7F到87(也差8).
(1):E000000901010000007F
(2):E001000901010000007E

(1):E0000001010100000087  (累加和=0xE3,
(2):E0000002010100000086   (累加和=0xE4,

所以我推断是(累加和+某一特定数),然后再取反.
对于后两种,某一特定数=0x96

对于C1420000D80000000200000000000000000000A7,某一特定数=0xE6.

当然这不是最清晰的描述,你需要更多的数据组合去验证.
0
回复
mckeeqin
LV.1
4
2009-01-05 13:08
@whatcall
我觉得可以肯定是一种计算累加和的一种方式(但是最后的校验字节是和的补码).从你列的所有数据来看,都符合这个规律,比如::C1420000D80000000200000000000000000000A7:C2420000D80000000200000000000000000000A6C1增加为C2,A7则减小到A6.其余两种数据也一样,并且这两种之间的第一组中校验码钱的字节和差8(09->01),校验码从7F到87(也差8).(1):E000000901010000007F(2):E001000901010000007E(1):E0000001010100000087  (累加和=0xE3,(2):E0000002010100000086  (累加和=0xE4,所以我推断是(累加和+某一特定数),然后再取反.对于后两种,某一特定数=0x96对于C1420000D80000000200000000000000000000A7,某一特定数=0xE6.当然这不是最清晰的描述,你需要更多的数据组合去验证.
whatcall 你好,先谢谢你的回复,你提示的思路我试了,对B机可以推出一个特定值,对C机发的数据也可以推出一个特定值,可是对返回给A机的数据就不吻合了,(B机和C机返回给A机的数据刚在一楼做了补充,由于这些数据实时都在变化,且较长,怕影响大家的思路,故开始没有介绍)
0
回复
whatcall
LV.5
5
2009-01-05 23:40
@mckeeqin
whatcall你好,先谢谢你的回复,你提示的思路我试了,对B机可以推出一个特定值,对C机发的数据也可以推出一个特定值,可是对返回给A机的数据就不吻合了,(B机和C机返回给A机的数据刚在一楼做了补充,由于这些数据实时都在变化,且较长,怕影响大家的思路,故开始没有介绍)
数据确实很多,而且没有按字节隔开,看起来很费劲.你说的最后“两位”,我想值得应该是最后“一个字节”,对不对?
既然你验证过了不符合,是不是再考虑考虑这一串数据当中有没有可能某几个字节是不参与检验的?或者校验吗是16位的(2个字节)?当然只有再找更多的数据来验证了,确实没什么好方法.尤其是CRC或其变种,校验码与前面的数据关系不是很直观.还有一些校验方式比如异或(XOR)也可以试试.总之,祝你好运.
0
回复
mckeeqin
LV.1
6
2009-01-06 08:19
@whatcall
数据确实很多,而且没有按字节隔开,看起来很费劲.你说的最后“两位”,我想值得应该是最后“一个字节”,对不对?既然你验证过了不符合,是不是再考虑考虑这一串数据当中有没有可能某几个字节是不参与检验的?或者校验吗是16位的(2个字节)?当然只有再找更多的数据来验证了,确实没什么好方法.尤其是CRC或其变种,校验码与前面的数据关系不是很直观.还有一些校验方式比如异或(XOR)也可以试试.总之,祝你好运.
前面我说的最后两位是指最后一个字节,
校验码是16位的(2个字节)估计不太可能,因为平时从发送的数据和接收的数据看,跟随前面数据一起变化的一直是最后一个字节,而非两个字节.
多谢你的关注 我一定会再努力试的!
0
回复