Arduino与树莓派运行的Python程序串口通信1-2秒延迟问题排查
问题原因定位
硬件无故障,延迟完全来自树莓派侧的软件缓冲配置,核心依据是同款硬件、代码接桌面端运行无延迟,可直接排除陀螺仪、Arduino、传输线路的硬件故障可能。
具体问题点及修复方案
- 冗余串口操作
你的Python代码中serial.Serial()构造方法执行时默认就会打开指定串口,后续额外调用ser.open()属于无效操作,虽不直接引发延迟,但属于不规范写法,建议直接删除。
- 冗余串口操作
- 串口缓冲配置问题
pyserial默认会开启输入缓冲,初始化串口时可追加参数禁用流控、设置短超时并清空初始缓冲,避免历史数据积压:
- 串口缓冲配置问题
import serial from serial.serialutil import SerialException # 初始化串口时追加配置 ser = serial.Serial( port="/dev/ttyACM0", baudrate=115200, timeout=0.5, rtscts=False, dsrdtr=False ) # 清空初始缓冲区残留数据 ser.reset_input_buffer()
- 输出缓冲导致的假延迟(最高概率)
Python默认当输出目标不是本地交互终端时(比如通过SSH远程执行脚本),print函数会启用块缓冲,数据会攒到固定大小才批量输出,观感上就是1-2秒的延迟,两种修复方案选其一即可:
- 运行脚本时添加
-u参数强制关闭缓冲:python3 -u your_script_name.py - 调用
print时追加flush=True参数强制立即刷新输出:
while True: line = ser.readline() if line: print(line, flush=True)- 输出缓冲导致的假延迟(最高概率)
验证方法
可以直接给树莓派接显示器键盘,本地运行脚本测试延迟,如果延迟消失,即可100%确认是SSH会话+Python输出缓冲导致的问题。
内容的提问来源于stack exchange,提问作者PotatoShavings
相关产品推荐
相关产品推荐

