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

使用pyserial时Quectel BG95模块无法执行AT+COPS写入命令

Quectel BG95 AT+COPS写入命令串口报错及解决思路

问题概述

使用Quectel BG95评估板执行AT+COPS=0,2命令时,串口返回错误:Error: device reports readiness to read, but returned no data (device disconnected or multiple access on port?)。发送b'AT+COPS=0,2\r\n'后无数据返回,原串口无法继续交互,但设备可通过其他串口访问。其他AT命令(如AT+COPS?)可正常执行,该命令在Quectel QNavigator中能正常运行,已设置180秒超时并插入SIM卡。

可能的解决方法

1. 移除串口独占模式参数

你的串口配置里启用了exclusive=True,BG95执行运营商切换类命令时,可能会临时重置串口或触发内部端口切换,独占模式会锁定原端口导致后续无法访问。尝试去掉该参数:

serial.Serial(port=portname, baudrate=115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=180)

2. 调整命令执行的等待逻辑

AT+COPS切换模式时,模块处理SIM卡注册需要较长时间,不要依赖readline()这类依赖换行符的方法立刻读取结果。先等待足够时长(比如185秒,比最大处理时间多5秒),再一次性读取缓冲区所有内容:

import time

serialPort.write(b'AT+COPS=0,2\r\n')
time.sleep(185)  # 留足命令处理时间
response = serialPort.read_all()
print(response)

3. 开启硬件流控

部分BG95评估板默认启用硬件流控,而你的串口配置未开启,可能导致数据传输中断。尝试添加流控参数:

serial.Serial(port=portname, baudrate=115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=180, rtscts=True)

或者先通过AT命令关闭硬件流控:执行AT+IFC=0,0后,用AT&W保存配置。

4. 持续监听串口的URC提示

BG95完成运营商切换时,可能先发送主动上报码(URC)如+COPS: 0,2,"xxxx",x,而非直接返回OK。可以在发送命令后循环监听串口,直到收到URC、OK或ERROR:

import time

serialPort.write(b'AT+COPS=0,2\r\n')
start_time = time.time()
while time.time() - start_time < 180:
    if serialPort.in_waiting > 0:
        data = serialPort.read(serialPort.in_waiting)
        print(data)
        if b'+COPS:' in data or b'OK' in data or b'ERROR' in data:
            break
    time.sleep(0.1)

5. 端口失效后自动重连验证

如果命令执行后端口发生变化(比如从tty3变为tty4),可以在捕获错误后自动扫描可用串口,重新连接后发送AT+COPS?,验证模式是否已切换成功。

额外提示

  • 模块执行AT+COPS切换时,可能会重启底层通信模块,导致串口临时断开,这是正常现象,待端口恢复后再检查结果即可。
  • 用minicom等串口调试工具手动执行命令,观察完整交互过程,对比代码逻辑找出差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:32:38