PySerial读取Arduino串口存在延迟问题求助
问题分析与解决
你的延迟问题核心出在两个地方:Arduino端没发送换行符导致Python的readline()一直阻塞等待;另外Arduino用String类拼接数据的效率极低,拖慢了输出速度。
Arduino代码修改
- 把
Serial.print替换成Serial.println,给每组数据加上换行符,让Python的readline()能及时读取到完整数据,不会一直卡着等结束符 - 放弃
String类拼接,改用分段Serial.print输出,大幅提升Arduino的处理效率
修改后的Arduino代码:
const int SW_pin = 2; const int X_pin = 0; const int Y_pin = 1; void setup(){ pinMode(SW_pin, INPUT); digitalWrite(SW_pin, HIGH); Serial.begin(9600); } void loop(){ int buttonread = digitalRead(SW_pin); int xread = analogRead(X_pin); int yread = analogRead(Y_pin); // 分段输出,最后加换行符 Serial.print(buttonread); Serial.print(":"); Serial.print(xread); Serial.print(":"); Serial.println(yread); // 可选:加10ms短延迟,避免串口发送过于频繁导致缓冲区溢出 delay(10); }
Python代码优化
- 给串口设置超时时间,防止
readline()无限阻塞 - 初始化时清空串口缓冲区,避免残留旧数据干扰读取
修改后的Python代码:
import serial import pydirectinput as pg pg.FAILSAFE=False # 初始化串口,添加1秒超时时间 ser = serial.Serial("COM3", 9600, timeout=1) # 清空输入缓冲区 ser.flushInput() while True: try: # 读取数据并去除首尾的换行、空格 read = ser.readline().decode('ascii').strip() if read: # 只处理非空数据 print(read) except Exception as e: print(f"读取错误: {e}") break
额外注意事项
- 确保Arduino和Python的串口波特率完全一致,不一致会导致乱码或延迟
- 如果仍有延迟,可以尝试将波特率提高到115200,提升数据传输速度
- Arduino的
loop()里尽量避免耗时操作,保持数据输出的连贯性
内容的提问来源于stack exchange,提问作者departed sir
相关产品推荐
相关产品推荐

