Python串口间隔发送时无法向Arduino Nano传输数据
问题分析与解决:Arduino Nano串口延迟发送数据异常
核心问题点
你的代码存在两个关键问题,导致延迟发送时数据传输异常:
newData标志未重置:Arduino代码中,收到结束符~后将newData设为true,但后续从未将其改回false,导致后续串口数据读取逻辑完全失效,无法处理新数据。- 字符串未终止:
receivedChars数组未添加字符串终止符'\0',Serial.println()输出时会读取到数组末尾的随机内存内容,甚至输出空内容。
另外,Arduino Nano在串口连接建立时会自动重启,若Python延迟发送数据,Arduino已发送READY字符串到缓冲区,未清空可能干扰后续读取,但这不是主要问题。
修正后的Arduino代码
#include <Servo.h> bool newData = false; char receivedChars[64]; void setup() { Serial.begin(9600); delay(1000); Serial.println("READY"); } void loop() { static byte ndx = 0; char endMarker = '~'; char rc; // 仅当无未处理数据时,读取串口数据 while (Serial.available() && newData == false) { rc = Serial.read(); if (rc != endMarker) { // 防止数组溢出 if (ndx < sizeof(receivedChars) - 1) { receivedChars[ndx] = rc; ndx++; } } else { // 添加字符串终止符,确保Serial.println正常输出 receivedChars[ndx] = '\0'; ndx = 0; newData = true; } } // 处理并输出接收到的数据,之后重置标志 if (newData) { Serial.println(receivedChars); newData = false; } }
Python代码优化建议
添加串口缓冲区清空逻辑,避免Arduino重启时发送的READY字符串干扰后续读取:
import serial import time port = 'COM6' baudrate = 9600 # 打开串口连接 ser = serial.Serial(port, baudrate) time.sleep(3) # 清空串口缓冲区,移除Arduino重启时的残留数据 ser.flushInput() data_to_send = "hello, world~" data_bytes = data_to_send.encode('utf-8') while True: ser.write(data_bytes) data = ser.readline() print("data", data) print(f"Data sent: {data_to_send}") # 可选:添加小延迟避免发送过于频繁 time.sleep(0.1)
验证效果
修改后,无论Python是否添加time.sleep(3),都能正常接收并返回数据,输出会恢复为:
Data sent: hello, world~ data b'hello, world\r\n' Data sent: hello, world~ data b'hello, world\r\n' ...
内容的提问来源于stack exchange,提问作者safwanyasin
相关产品推荐
相关产品推荐

