1

我正在使用Serial.write向工作中的设备发送命令(工作正常)。

在我成功地将数据发送到外部设备后,我收到了一个8-byte我试图在 python 上读取的响应。我知道 8 字节应该是什么样子,因为我使用的是oscilloscopeinserial protocol moderealTerminal.

我的 python 程序读取的前四个字节是正确的,但后来我得到了垃圾。ser.read我使用什么命令并不重要。

这是代码和输出:

    import serial
    import time

    ser = serial.Serial(port='COM10',baudrate=38400,timeout=1)

    wakeupSAA232 = b'\x0D'
    ser.write(wakeupSAA232)


    time.sleep(0.5)


    sendData = bytearray([170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, 0])

    ser.write(sendData)

    #s = ser.read_until('\r')

    s = ser.read(8)

    print(s)

我知道我应该阅读:

00 00 00 F8 0A 14 16 0D (8 个字节),十六进制

但这里是输出:

b'\x00\x00\x00\xf8\n\x04\x07\r'

如果我再次运行该程序。输出: b'\x00\x00\x00\xf8\n\x94\x96\r'

每次程序运行时,最后 4 个字节(应该是什么)都会得到不同的垃圾。

前 4 个字节是正确的 (the x00\x00\x00\xf8)。其余的是与我的范围或终端数据不匹配的垃圾。

范围内的 8 字节十六进制数据: 示波器上 8 个字节的十六进制数据

终端上的 8 字节十六进制数据: 终端上 8 个字节的十六进制数据

我试图在网上搜索我的问题,但我需要一些指导。

4

1 回答 1

1

我认为您可能需要查看设备的协议。

在你这样做之前,你应该注意你收到的帧的第二块可能不是垃圾。

Python 使用 Unicode,但除非被指示以十六进制显示它们,否则它将用它们的 ASCII 等价物替换它们。因此,如果您想将它们设置为十六进制,只需执行以下操作:

b'\x00\x00\x00\xf8\n\x94\x96\r'.hex()

它会给你:

'000000f80a04070d'

和:

b'\x00\x00\x00\xf8\n\x94\x96\r'.hex()

给出:

'000000f80a94960d'

与您在示波器和 RealTerm 上获得的内容相比,仍然存在一些差异,但如果您查看协议,现在可能会更有意义。也许帧上的某些字节(0x14、0x16)会改变以表示一些有意义的东西,比如消息号。

于 2019-11-30T09:26:20.297 回答