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

使用Quectel EG25-G时Minicom可用但PySerial提示设备忙求助

问题分析

报错could not open port /dev/ttyUSB2: [Errno 16] Device or resource busy: '/dev/ttyUSB2'是因为ModemManager已独占该串口,Linux串口默认采用独占访问机制,导致PySerial无法打开端口。而你能通过minicom正常发送AT命令,大概率是因为minicom连接的是模块的另一路AT命令串口(Quectel EG25-G通常会暴露多个USB串口,比如ttyUSB0为主AT口,ttyUSB2可能被ModemManager用作数据/控制端口)。

解决方案

方法1:切换到未被占用的AT串口

  1. 列出所有Quectel相关串口:
    ls /dev/ttyUSB*
    
    通常会输出ttyUSB0、ttyUSB1、ttyUSB2等条目。
  2. 用minicom逐个测试这些串口,找到能正常发送AT并返回OK的端口(此端口即为未被ModemManager占用的AT命令口)。
  3. 修改PySerial脚本的端口路径,同时建议增加超时参数避免脚本卡住:
    from serial import Serial
    
    port = Serial("/dev/ttyUSB0", baudrate=115200, timeout=2)
    port.write(b'AT\r')
    print(port.read_all().decode('utf-8'))
    port.close()
    

方法2:通过ModemManager的DBus接口发送AT命令

既然ModemManager已接管模块,直接用它提供的官方接口发送AT命令,无需直接操作串口:

  1. 安装ModemManager命令行工具(未安装时执行):
    sudo apt install modemmanager
    
  2. 查找ModemManager识别的调制解调器路径:
    mmcli -L
    
    输出类似/org/freedesktop/ModemManager1/Modem/0,其中0为调制解调器编号。
  3. 发送AT命令(替换0为实际编号):
    mmcli -m 0 --command="AT"
    
  4. Python中通过pydbus调用DBus接口实现:
    import pydbus
    
    bus = pydbus.SystemBus()
    modem = bus.get('org.freedesktop.ModemManager1', '/org/freedesktop/ModemManager1/Modem/0')
    result = modem.Command('AT', 10)  # 10为超时时间(秒)
    print(result)
    

方法3:配置ModemManager忽略指定串口

若必须使用ttyUSB2,可修改ModemManager配置让它跳过该端口:

  1. 创建配置文件:
    sudo nano /etc/ModemManager/conf.d/99-ignore-ttyUSB2.conf
    
  2. 添加以下内容(先通过lsusb | grep Quectel确认模块的厂商/产品ID,替换示例中的0x2c7c和0x0125):
    [device]
    FilterVendor=0x2c7c
    FilterProduct=0x0125
    FilterPortName=ttyUSB2
    
  3. 重启ModemManager生效:
    sudo systemctl restart ModemManager
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:06:15