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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:31:36