为什么 python 的 serial.read, serial.read_until 在 4 个字节后返回垃圾?
Why is python's serial.read, serial.read_until returning garbage after 4 bytes?
我正在使用 Serial.write 向工作中的设备发送命令(工作正常)。
在我成功将数据发送到外部设备后,我收到了一个 8-byte
响应,我正试图在 python 上阅读该响应。我知道 8 字节应该是什么样子,因为我在 serial protocol mode
中使用 oscilloscope
,还有 realTerminal
.
我的 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 个字节是正确的(x00\x00\x00\xf8
)。其余的是与我的范围或终端数据不匹配的垃圾。
范围内的 8 字节十六进制数据:
终端上的 8 个字节的十六进制数据:
我已尝试在线搜索我的问题,但我需要一些指导。
我认为您可能需要查看设备的协议。
在你这样做之前,你应该注意你接收到的帧的第二块可能不是垃圾。
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) 上的某些字节会更改以表示一些有意义的内容,例如消息编号。
我正在使用 Serial.write 向工作中的设备发送命令(工作正常)。
在我成功将数据发送到外部设备后,我收到了一个 8-byte
响应,我正试图在 python 上阅读该响应。我知道 8 字节应该是什么样子,因为我在 serial protocol mode
中使用 oscilloscope
,还有 realTerminal
.
我的 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 个字节是正确的(x00\x00\x00\xf8
)。其余的是与我的范围或终端数据不匹配的垃圾。
范围内的 8 字节十六进制数据:
终端上的 8 个字节的十六进制数据:
我已尝试在线搜索我的问题,但我需要一些指导。
我认为您可能需要查看设备的协议。
在你这样做之前,你应该注意你接收到的帧的第二块可能不是垃圾。
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) 上的某些字节会更改以表示一些有意义的内容,例如消息编号。