如何构建字节数组帧并计算校验和

时间:2016-11-02 14:02:59

标签: python binary serial-port hex 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()

代码执行时没有错误,我在一个单独的脚本/进程中监视同一个端口。设备应该在收到成功帧时返回帧。

在这个例子中,我手动计算了校验和,校验和定义为:

双字节校验和,MSB优先,在从FSN.msb ... DATA [dsize]重新交换的整个帧上计算。校验和是通过简单的16位无符号字节添加

计算的

因此,在这种情况下,除了校验和之外,在帧中添加所有内容将等于10,如在没有添加的情况下执行求和(帧)所示。加上它,总和是20。

另一端的设备可能有故障,所以这是一个难以适应的工作环境,但是如果有人能够审核我的方法,那会很好吗?

生成校验和的字面意思很简单,还是需要其他东西呢?

1 个答案:

答案 0 :(得分:2)

是的就是这么简单 - 你通常会填写你的框架,并将校验和添加到另一个阶段 - 如:

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" (最重要的字节)首先。正如你的规范。这应该工作 - 如果不是,你可能会在其他一个领域出现一些格式错误。