Python与Arduino串口通信:进入while循环后如何停止Arduino发数据?
解决Python启动循环后让Arduino停止发送数据的问题
这问题我之前做串口通信项目时也碰到过,核心思路是让Python主动给Arduino发送一个"停止"指令,然后在Arduino端监听这个指令,收到后就暂停数据发送。毕竟串口是双向通信,单方面Python停止接收没用,Arduino根本不知道要停,还会一直往外发。
下面分两端给出修改方案:
Arduino端代码修改
你需要在Arduino的代码里加入指令监听逻辑,只有收到Python的允许信号时才发送数据:
boolean shouldSend = true; // 控制是否发送数据的开关 void setup() { Serial.begin(9600); // 波特率要和Python端一致 while (!Serial) {} // 等待串口连接(针对部分Arduino板) } void loop() { // 优先检查来自Python的指令 if (Serial.available() > 0) { String command = Serial.readStringUntil('\n'); command.trim(); // 去除换行、空格等冗余字符 if (command == "STOP") { shouldSend = false; // 收到停止指令,关闭发送 } else if (command == "START") { shouldSend = true; // 可选:恢复发送的指令 } } // 仅在允许发送时执行原发送逻辑 if (shouldSend) { // 这里替换成你原来的发送代码,比如发送"1" Serial.println("1"); delay(100); // 可选:控制发送频率,避免数据堆积 } }
Python端代码修改
在进入while循环前,先给Arduino发送"STOP"指令,通知它停止发送:
import serial import time # 初始化串口,端口和波特率根据你的实际情况调整 arduino = serial.Serial('COM3', 9600, timeout=1) # 发送停止指令给Arduino arduino.write(b"STOP\n") time.sleep(0.1) # 给Arduino一点处理指令的时间 while True: data = arduino.readline() str_data = data[:-2].decode().strip() # 处理串口数据,去掉冗余字符 print(str_data) # 调试输出 if str_data == "1": # 根据你的实际判断条件调整 # 执行你的业务逻辑 print("执行自定义逻辑...") # 如果你之后需要让Arduino恢复发送,可以加这行 # arduino.write(b"START\n")
几个关键注意点
- 波特率一致:Python和Arduino的串口波特率必须完全相同,否则会出现乱码或指令无法识别的问题。
- 指令格式统一:两边都用换行符
\n作为指令结束标志,这样readline()和readStringUntil('\n')才能正确读取完整指令。 - 初始状态可控:如果不想Arduino一上电就开始发数据,可以把初始的
shouldSend设为false,等Python发送"START"指令后再开始发送,这样整个流程会更可控。
内容的提问来源于stack exchange,提问作者Daniel




