You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动