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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:06:24