Python串口通信输出异常求助:收到十六进制+ASCII混合数据
解决串口通信中Python字节串显示的误解及数据处理
Hey there! Let's clear up the confusion here and get you seeing the data you expect.
首先:你的数据其实已经正确接收了!
那个看起来像是“十六进制+ASCII混合”的输出b'\x0b\x16 )6\x06\x07\x08X\x02\x16,',只是Python对**字节串(bytes类型)**的默认显示规则:
- 当字节值对应可打印的ASCII字符时,直接显示该字符
- 当字节值是不可打印的控制字符(比如<32或>126)时,用十六进制转义符
\xXX表示
我们把它和你发送的uint8_t myBuf[]={11,22,32,41,54,6,7,8,88,2,22,44}一一对应验证:
- 11 →
\x0b(不可打印,显示十六进制) - 22 →
\x16(不可打印) - 32 → 空格(ASCII 32是可打印的空格字符)
- 41 →
)(ASCII 41对应右括号) - 54 →
6(ASCII 54对应数字6) - 6 →
\x06(不可打印) - 7 →
\x07(不可打印) - 8 →
\x08(不可打印) - 88 →
X(ASCII 88对应大写X) - 2 →
\x02(不可打印) - 22 →
\x16(不可打印) - 44 →
,(ASCII 44对应逗号)
完全匹配!所以串口通信本身没有问题,只是显示方式让你误以为数据错了。
如何转换成你期望的uint8数值列表?
如果你想直接看到发送的整数数值,可以把字节串转换成整数列表。修改你的代码如下:
import matplotlib.pyplot as plt import matplotlib.animation as animation from matplotlib import style import serial import time MCU = serial.Serial('COM35', 115200, timeout=.1) time.sleep(1) # 给连接一点时间稳定 while True: data = MCU.readline() if data: # 确保收到有效数据再处理 # 将字节串转换为uint8整数列表 received_values = list(data) print("Received uint8 values:", received_values)
运行这段代码,你应该会输出和myBuf完全一致的列表:[11,22,32,41,54,6,7,8,88,2,22,44]。
额外注意点
- 确认你的MCU发送数据时,是否在末尾添加了换行符(
\n)?因为readline()是等待换行符或超时才返回数据。如果MCU没有发送换行,你可能会收到不完整的数据,这时候可以改用MCU.read(12)直接读取固定长度的12字节数据。 - 确保串口配置(波特率、校验位、停止位)和MCU端完全一致,默认
serial.Serial是无校验、1个停止位,如果你MCU端有不同配置,需要在初始化时指定(比如serial.Serial('COM35', 115200, parity=serial.PARITY_EVEN, stopbits=serial.STOPBITS_TWO, timeout=.1))。
内容的提问来源于stack exchange,提问作者user3764118
相关产品推荐
相关产品推荐

