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
相关产品推荐
相关产品推荐

