使用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串口
- 列出所有Quectel相关串口:
通常会输出ls /dev/ttyUSB*ttyUSB0、ttyUSB1、ttyUSB2等条目。 - 用minicom逐个测试这些串口,找到能正常发送
AT并返回OK的端口(此端口即为未被ModemManager占用的AT命令口)。 - 修改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命令,无需直接操作串口:
- 安装ModemManager命令行工具(未安装时执行):
sudo apt install modemmanager - 查找ModemManager识别的调制解调器路径:
输出类似mmcli -L/org/freedesktop/ModemManager1/Modem/0,其中0为调制解调器编号。 - 发送AT命令(替换
0为实际编号):mmcli -m 0 --command="AT" - 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配置让它跳过该端口:
- 创建配置文件:
sudo nano /etc/ModemManager/conf.d/99-ignore-ttyUSB2.conf - 添加以下内容(先通过
lsusb | grep Quectel确认模块的厂商/产品ID,替换示例中的0x2c7c和0x0125):[device] FilterVendor=0x2c7c FilterProduct=0x0125 FilterPortName=ttyUSB2 - 重启ModemManager生效:
sudo systemctl restart ModemManager
内容的提问来源于stack exchange,提问作者L1RG0
相关产品推荐
相关产品推荐

