如何在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
相关产品推荐
相关产品推荐

