You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySerial与Arduino通信故障:发送数据时Arduino重启求助

解决Python向Arduino发送整数导致设备重启的问题

结合你的描述,问题大概率出在Arduino串口连接时的自动复位上——大部分Arduino板(比如Uno、Nano)在电脑打开串口时会触发硬件复位,如果你在复位完成前就发送数据,就会导致设备异常重启。另外数据发送格式不匹配也可能引发问题,下面是直接可用的代码方案:

Arduino端代码

const int MN = 387;

void setup() {
  Serial.begin(9600);
  // 等待串口完全连接(针对USB串口的自动复位机制)
  while (!Serial) {
    ; // 空循环等待,确保串口准备好再执行后续逻辑
  }
}

void loop() {
  // 检查是否有串口数据到来
  if (Serial.available() > 0) {
    // 读取整数,自动忽略非数字字符
    int receivedNum = Serial.parseInt();
    
    // 对比魔术数字
    if (receivedNum == MN) {
      Serial.println(MN); // 匹配成功,返回预设的MN
    } else {
      // 可选:返回不匹配提示,方便调试
      Serial.println("Number mismatch");
    }
  }
}

Python端代码

需要先安装pyserial库:pip install pyserial

import serial
import time

# 替换成你的Arduino串口端口,Windows是COMx,Linux是/dev/ttyACM0,Mac是/dev/tty.usbmodemxxx
serial_port = 'COM3'
baud_rate = 9600

# 打开串口
ser = serial.Serial(serial_port, baud_rate, timeout=1)
# 关键:等待2秒让Arduino完成复位和初始化,时间可根据板子调整(1-3秒都可以)
time.sleep(2)

magic_number = 387
# 发送整数:转成字符串加换行符,让Arduino能正确识别数据结束
ser.write(f"{magic_number}\n".encode('utf-8'))
print(f"已向Arduino发送: {magic_number}")

# 读取Arduino返回的数据
response = ser.readline().decode('utf-8').strip()
if response:
    print(f"Arduino返回数据: {response}")

# 关闭串口
ser.close()

关键注意事项

  • 串口延迟必须加:这是解决复位问题的核心,Python打开串口后,Arduino需要1-2秒完成重启和setup()执行,提前发送数据会干扰复位过程导致重启。
  • 数据格式要统一:Python发送时必须加换行符\n,因为Arduino的Serial.parseInt()需要明确的结束标记,否则会一直等待数据,导致解析异常。
  • 端口和波特率要匹配:确保Python里的串口端口和波特率与Arduino代码完全一致,波特率不匹配会导致乱码或无法通信。

如果还是有问题,可以尝试禁用Arduino的自动复位(在RESET引脚和GND之间接一个10uF电解电容),不过优先用代码里的延迟方案更简单。

内容的提问来源于stack exchange,提问作者OLEERM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:38:40