You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 20:55:21