如何构建字节数组帧并计算校验和
How to build byte array frame and calculate checksum
我正在尝试与规范中定义的串行端口进行通信。
ser = serial.Serial("/dev/ttyUSB0", baudrate="115200")
frame = bytearray([
0x00, 0x00, #frame control (2 bytes)
0x00, 0x00, #machine id (2 bytes)
0x07, # number of bytes in data field
0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, #data field itself
0x00, 0x0A #checksum
])
ser.write(frame)
ser.close()
代码执行无误,我在单独的 script/process 中监视同一个端口。设备在收到成功帧时应该 return 帧。
在这个例子中,我手动计算了校验和,其定义为:
双字节校验和,MSB 在前,从 FSN.msb...DATA[dsize] 重新计算整个帧。校验和是通过简单的 16 位无符号加法 bytes
计算得出的
因此,在这种情况下,除了校验和之外,将帧中的所有内容相加都将等于 10,如在不添加校验和的情况下执行 sum(frame) 所示。加上它,总和就是20
另一端的设备可能有故障,所以这是一个很难在其中工作的环境,但是到目前为止,如果有人可以审核我的方法,那就太好了?
生成校验和真的那么简单,还是需要其他东西?
是的,就是这么简单 -
你通常会填写你的框架,并在另一个阶段附加校验和 - 如:
In [73]: frame = bytearray([
...: 0x00, 0x00, #frame control (2 bytes)
...: 0x00, 0x00, #machine id (2 bytes)
...: 0x07, # number of bytes in data field
...: 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, #data field itself
...: ])
In [75]: checksum = sum(frame)
In [76]: frame.extend((checksum // 256, checksum % 256))
In [80]: print (", ".join("\x%02X" % v for v in frame))
\x00, \x00, \x00, \x00, \x07, \x01, \x01, \x01, \x00, \x00, \x00, \x00, \x00, \x0A
现在,注意一个细节:我在 "natual order" 中添加了校验和的 2 个字节 - 首先是 "MSB"(最高有效字节)。就像你的规格一样。这应该有效 - 如果不是,您可能会在其他字段之一中出现格式错误。
我正在尝试与规范中定义的串行端口进行通信。
ser = serial.Serial("/dev/ttyUSB0", baudrate="115200")
frame = bytearray([
0x00, 0x00, #frame control (2 bytes)
0x00, 0x00, #machine id (2 bytes)
0x07, # number of bytes in data field
0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, #data field itself
0x00, 0x0A #checksum
])
ser.write(frame)
ser.close()
代码执行无误,我在单独的 script/process 中监视同一个端口。设备在收到成功帧时应该 return 帧。
在这个例子中,我手动计算了校验和,其定义为:
双字节校验和,MSB 在前,从 FSN.msb...DATA[dsize] 重新计算整个帧。校验和是通过简单的 16 位无符号加法 bytes
计算得出的因此,在这种情况下,除了校验和之外,将帧中的所有内容相加都将等于 10,如在不添加校验和的情况下执行 sum(frame) 所示。加上它,总和就是20
另一端的设备可能有故障,所以这是一个很难在其中工作的环境,但是到目前为止,如果有人可以审核我的方法,那就太好了?
生成校验和真的那么简单,还是需要其他东西?
是的,就是这么简单 - 你通常会填写你的框架,并在另一个阶段附加校验和 - 如:
In [73]: frame = bytearray([
...: 0x00, 0x00, #frame control (2 bytes)
...: 0x00, 0x00, #machine id (2 bytes)
...: 0x07, # number of bytes in data field
...: 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, #data field itself
...: ])
In [75]: checksum = sum(frame)
In [76]: frame.extend((checksum // 256, checksum % 256))
In [80]: print (", ".join("\x%02X" % v for v in frame))
\x00, \x00, \x00, \x00, \x07, \x01, \x01, \x01, \x00, \x00, \x00, \x00, \x00, \x0A
现在,注意一个细节:我在 "natual order" 中添加了校验和的 2 个字节 - 首先是 "MSB"(最高有效字节)。就像你的规格一样。这应该有效 - 如果不是,您可能会在其他字段之一中出现格式错误。