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

如何在Python中同时运行实时进程?传感器数据转Arduino异常求助

解决Python实时向Arduino写入UDP传感器数据的缓冲问题

我之前也碰到过一模一样的串口传输问题,这基本是串口输出缓冲没有即时刷新导致的——Python的serial库默认会把数据暂存在缓冲区里,攒到一定容量才会真正发送给Arduino,所以你看到的现象就是:脚本运行时数据都堆在缓冲里,只有当你终止脚本时,系统才会自动清空缓冲,把最后一组数据发出去。

下面是几个针对性的解决方案,按优先级尝试:

1. 强制刷新串口缓冲(最关键的一步)

每次调用ser.write()之后,立刻调用ser.flush()来强制把缓冲区里的数据发送出去,修改你的Python代码如下:

import socket, traceback
import serial
import time
host='192.168.100.8'
port=4000
ser=serial.Serial(port='COM3',baudrate=115200)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.bind((host, port))
k=[]
while 1:
    try:
        message, address = s.recvfrom(8192)
        k=map(str,message.strip().split(','))
        yaw,pitch,roll=k[-3:]
        l=yaw+','+pitch+','+roll+'\0'
        print(l)
        ser.write(l)
        ser.flush()  # 新增:强制刷新串口缓冲
    except (KeyboardInterrupt, SystemExit):
        ser.close()  # 退出前关闭串口,避免占用
        exit()
    except:
        traceback.print_exc()

2. 检查Arduino端的接收逻辑

有时候问题不在PC端,而是Arduino没有及时处理 incoming data。比如如果你的Arduino代码用readStringUntil('\0')读取数据,要确保每次读完后清空接收缓冲,避免残留数据干扰后续接收。这里给你一个简单的Arduino测试代码:

void setup() {
  Serial.begin(115200);
  while (!Serial); // 等待串口连接(仅针对USB串口)
}

void loop() {
  if (Serial.available() > 0) {
    // 读取到终止符'\0'为止
    String sensorData = Serial.readStringUntil('\0');
    // 分割yaw、pitch、roll
    int comma1 = sensorData.indexOf(',');
    int comma2 = sensorData.indexOf(',', comma1+1);
    if (comma1 != -1 && comma2 != -1) {
      float yaw = sensorData.substring(0, comma1).toFloat();
      float pitch = sensorData.substring(comma1+1, comma2).toFloat();
      float roll = sensorData.substring(comma2+1).toFloat();
      // 打印调试信息,确认收到数据
      Serial.print("Yaw: ");
      Serial.print(yaw);
      Serial.print(" | Pitch: ");
      Serial.print(pitch);
      Serial.print(" | Roll: ");
      Serial.println(roll);
    }
    // 清空剩余的缓冲数据,避免下一次读取到残留内容
    while(Serial.available()) {
      Serial.read();
    }
  }
}

3. 优化Python循环的实时性(可选)

如果传感器数据推送频率很高,你可以给循环加一个极小的延迟,避免Arduino处理不过来,比如在ser.flush()之后加一行:

time.sleep(0.005)  # 5毫秒延迟,根据实际情况调整

注意不要加太长的延迟,否则会影响数据的实时性。

额外检查项

  • 确认Arduino的串口波特率和Python代码里的115200完全一致;
  • 确保没有其他程序(比如Arduino IDE的串口监视器)占用COM3端口;
  • 测试时可以先把Python的UDP接收部分注释掉,手动发送固定字符串给Arduino,确认串口通信正常后再整合UDP数据流。

内容的提问来源于stack exchange,提问作者Abhiped

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:51:57