使用pyserial时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

