我尝试与规范中定义的串口通信。
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。
另一端的设备可能有故障,所以这是一个难以适应的工作环境,但是如果有人能够审核我的方法,那会很好吗?
生成校验和的字面意思很简单,还是需要其他东西呢?
答案 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" (最重要的字节)首先。正如你的规范。这应该工作 - 如果不是,你可能会在其他一个领域出现一些格式错误。