为什么python的serial.read,serial.read_until等在4个字节后返回垃圾?

问题描述 投票:1回答:1

我是编程新手,这是我在这里的第一篇文章,如果我使用的某些术语不正确,请原谅我。

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

成功将数据发送到外部设备后,我收到一个8字节的响应,我正在[[尝试在python上读取。我知道8字节应该是什么样子,因为我使用的是串行协议模式的示波器,也使用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字节),以十六进制表示

但是这里是

OUTPUT:

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 bytes of Hex data on scope

8 bytes of Hex data on terminal

我试图在线搜索我的问题,但是我需要一些指导。预先感谢您的帮助。

python-3.x serial-port pyserial
1个回答
0
投票
我认为您可能需要查看设备的协议。

在执行此操作之前,您应该注意,接收到的帧的第二块可能根本不是垃圾。

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)更改以表示有意义的内容,例如消息号。 
© www.soinside.com 2019 - 2024. All rights reserved.