Python向Arduino串口发送长字符串无返回数据故障排查
问题原因
你遇到的Arduino收不到数据、Python读不到回传的问题,是几个典型的串口通信低级错误导致的:
- 打开串口后没有等待Arduino复位:Python执行
serial.Serial()打开串口的瞬间,会触发连接的Arduino硬件自动复位,整个重启+初始化流程需要1.5~2秒,你打开串口立刻执行write发送数据,此时Arduino还在跑bootloader,根本不会响应串口数据,所以Serial.available()始终检测不到输入。 - 两端超时设置过短:Arduino端
Serial.setTimeout(1)设置的是1ms超时,这个时间短到根本来不及读完一整行带换行符的数据,会直接返回空值;Python端1秒的读超时虽然勉强够用,但遇到串口波动很容易读空。 - Arduino回传没有加换行结束符:Python端
readline()是读到\n字符才会认为一行数据结束并返回,你Arduino用Serial.print(data)回传时末尾不带\n,Python端会一直等直到超时,自然没有输出。 - 额外排查点:测试前要关掉Arduino IDE自带的串口监视器、其他串口调试工具,这些软件会抢占COM口权限,导致Python端虽然实例化了串口对象,实际无法正常收发数据。
修正后可运行代码
Python端
import serial import time array = ["the first", "second","third", "fourth", "fifth", "sixth"] # 初始化串口,适当拉长读超时 serialArduino = serial.Serial("COM3", 9600, timeout=2, write_timeout=1) # 核心:等待Arduino重启完成 time.sleep(2) # 拼接待发送字符串 data = "" for item in array: data += f"{item}#" data += '\n' print("发送内容:", data) serialArduino.write(data.encode('utf-8')) # 读取回传内容,统一用utf-8解码即可 finalData = serialArduino.readline().decode('utf-8').strip() print("Arduino回传内容:", finalData) serialArduino.close()
Arduino端
void setup() { Serial.begin(9600); // 超时调整为100ms,足够读完一整行短数据 Serial.setTimeout(100); } void loop() { if(Serial.available() > 0){ String data = Serial.readStringUntil('\n'); // 回传时用println自动在末尾加\n,匹配Python端readline的结束判定 Serial.println(data); } }
字符串数组拆分参考
等收发正常后,你可以在Arduino端用下面的逻辑拆分#分隔的字符串,还原成原始数组:
// 提前定义数组存拆分结果,长度根据实际需求调整 String recvArr[10]; int arrIdx = 0; void loop() { if(Serial.available() > 0){ String data = Serial.readStringUntil('\n'); arrIdx = 0; int startPos = 0; int splitPos = data.indexOf('#'); // 循环按#分割 while(splitPos != -1){ recvArr[arrIdx] = data.substring(startPos, splitPos); arrIdx++; startPos = splitPos + 1; splitPos = data.indexOf('#', startPos); } // 测试:打印拆分后的每个元素 for(int i=0; i<arrIdx; i++){ Serial.println(recvArr[i]); } } }
内容的提问来源于stack exchange,提问作者Joas329
相关产品推荐
相关产品推荐

