如何解决Arduino与Python连接无响应及配置失败问题?
Arduino与Python连接故障排查与解决方法
问题背景
尝试配置Arduino与Python的连接,跟着十几篇教程操作都没成功。用pyserial连接时始终无响应,目标是在Python中处理数据后发送给Arduino执行。已经在两端安装Firmata库,也上传了Arduino标准Firmata程序,但问题依旧。
尝试过的代码
1. pyserial测试代码(Python)
import serial import time Arduino = serial.Serial('com5',115200) time.sleep(5) while True: while (Arduino.inWaiting()==0): print("ur dumb") pass dataPacket = Arduino.readline() print(dataPacket)
2. 对应Arduino测试代码
int count = 1; void setup() { Serial.begin(115200); } void loop() { Serial.print(count); delay(1000); count = count+1; }
3. pyfirmata测试代码(Python)
import pyfirmata import time board = pyfirmata.Arduino('/dev/ttyACM0') it = pyfirmata.util.Iterator(board) it.start() digital_input = board.get_pin('d:10:i') led = board.get_pin('d:13:o') while True: sw = digital_input.read() if sw is True: led.write(1) else: led.write(0) time.sleep(0.1)
排查与解决步骤
端口与波特率匹配检查
- 确认正确端口:在Arduino IDE的「工具」→「端口」查看设备实际占用的COM口(Windows)或/dev/tty*路径(Linux/macOS),确保Python代码中的端口与实际一致。Linux/macOS下如果权限不足,执行
sudo chmod 666 /dev/ttyACM0(替换为实际端口)赋予读写权限。 - 波特率严格一致:pyserial代码和Arduino代码的波特率都是115200,这点没问题;但使用pyfirmata时,标准Firmata默认波特率是57600,必须在初始化时指定匹配的波特率。
pyserial代码修复
- Arduino代码中
Serial.print(count)没有输出换行符,Python的readline()会一直等待换行导致无响应,修改Arduino代码为Serial.println(count)。 - 优化Python代码,添加异常处理和合理提示:
import serial import time try: # 添加timeout避免无限等待 Arduino = serial.Serial('com5', 115200, timeout=1) except serial.SerialException as e: print(f"串口连接失败: {e}") exit() time.sleep(2) # 缩短等待时间,2秒足够 print("已连接,等待数据...") while True: if Arduino.inWaiting() > 0: dataPacket = Arduino.readline().decode('utf-8').strip() print(f"收到数据: {dataPacket}") time.sleep(0.1)
pyfirmata代码适配
- Windows系统下端口需改为COM口格式,比如
'COM5',同时指定正确波特率:import pyfirmata import time try: board = pyfirmata.Arduino('COM5', baudrate=57600) except Exception as e: print(f"连接失败: {e}") exit() it = pyfirmata.util.Iterator(board) it.start() digital_input = board.get_pin('d:10:i') digital_input.enable_reporting() # 启用输入报告 led = board.get_pin('d:13:o') while True: sw = digital_input.read() # 处理None的情况(引脚未就绪) if sw is True: led.write(1) elif sw is False: led.write(0) time.sleep(0.1)
其他关键排查点
- 更换USB线:使用支持数据传输的USB线,避免用仅充电的线。
- 关闭Arduino串口监视器:串口只能被一个程序占用,打开监视器后Python无法获取串口权限。
- 重启设备:Arduino串口偶尔会出现卡死情况,重启Arduino和电脑后重试。
内容的提问来源于stack exchange,提问作者Nicholas Pacheck
相关产品推荐
相关产品推荐

