Python串口读取操作异常干扰print语句输出的问题咨询
问题:串口读取干扰print输出的异常分析
读取串口时出现异常,print语句的输出被破坏。执行如下Python代码:
ser = serial.Serial('COM13', 115200, timeout=5) ser.reset_input_buffer() ser.reset_output_buffer() ser.write("stat\n".encode('utf-8')) ser.flush() for i in range(10): print(f"read: <{self.ser.read(10).decode('utf-8')}>")
得到的输出如下:
>ead: <s read: < > read: <> read: <> read: <> ...
疑问:为何第一次输出时,Python打印的是'>'而非'read'中的'r'?用字符串替换串口调用后,该现象不再出现。
分析与解决
这是因为串口返回的数据流中包含退格符(\b)或异常的回车/换行控制字符,干扰了终端的光标位置,进而破坏了print的输出内容。
具体原因:
- 串口设备返回的响应里,存在退格符(ASCII码
0x08)。当这个字符被插入到print的格式化字符串中并输出时,会让终端光标回退一格,覆盖了"read:"里的第一个字符'r',最终显示成">ead:"。 - 后续输出里的单独'>'和换行异常,也是串口返回的不完整响应或额外控制字符导致的。
验证方法
打印串口读取的原始字节,确认是否存在控制字符:
for i in range(10): data = self.ser.read(10) print(f"原始字节: {data}") print(f"read: <{data.decode('utf-8')}>")
如果输出里有\x08,就说明确实是退格符在搞鬼。
解决思路
- 过滤控制字符:只保留可打印字符再输出:
import string for i in range(10): data = self.ser.read(10).decode('utf-8') # 过滤掉不可打印的控制字符 clean_data = ''.join([c for c in data if c in string.printable]) print(f"read: <{clean_data}>")
- 先处理响应再输出:读取完整的串口响应后,统一处理换行、回车等字符,再进行打印,避免实时输出时被控制字符干扰。
内容的提问来源于stack exchange,提问作者ACarter
相关产品推荐
相关产品推荐

