代码之家  ›  专栏  ›  技术社区  ›  Chris Barry

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

  •  0
  • Chris Barry  · 技术社区  · 9 年前

    我正在尝试与规范中定义的串行端口通信。

    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 回复  |  直到 9 年前
        1
  •  2
  •   jsbueno    9 年前

    是的,就是这么简单-

    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
    

    现在,请注意一个细节:我以“自然顺序”添加了校验和的2个字节,即“MSB”(最高有效字节)。正如在您的规范中一样,这应该是可行的-如果不是,您可能在其他字段中有一些格式错误。