Python操作USB调制解调器串口可写入但无法读取返回数据问题
USB调制解调器串口读取无响应问题排查与解决
问题表现
读取USB调制解调器串口数据时遇到两类异常:
- 写入串口数据功能正常,但调用读取接口后终端无响应卡住,仅能接收输入无任何反馈,按回车也无处理动作,最终只能通过
Ctrl+C强制终止程序 - 尝试读取指定字节数、遍历缓存变量等方案均无效,
inWaiting()/in_waiting方法返回值始终为0,即使调制解调器已成功接收写入的指令,也检测不到可读取的返回数据
问题复现代码
import time import serial ser = serial.Serial("/dev/ttyUSB2", 115200) time.sleep(1) ser.write(b'\r\n' + b'at' + b'\r\n') time.sleep(1) print(ser.readline())
根因分析
- 程序卡住的诱因:pyserial库默认初始化串口时未设置超时参数,
readline()方法会进入永久阻塞状态,直到接收到换行符才会返回,没有对应数据时就会一直处于等待状态,看起来像触发了无限循环 - 检测不到返回数据的原因:调制解调器的AT指令响应会拆分为多行返回,默认包含指令回显内容,原有代码的等待时长和无超时配置,导致还未等响应完全写入串口缓存就执行了读取操作,因此缓存区检测不到可用数据
修复方案
初始化串口时添加timeout参数设置读操作超时时间,再按行读取完整的多段响应即可:
import time import serial ser = serial.Serial(port="/dev/ttyUSB2", baudrate=115200, timeout=5) time.sleep(0.5) ser.write(b'at\r\n') time.sleep(0.5) print(ser.readline()) print(ser.readline()) print(ser.readline())
运行输出结果
b'at\r\n' b'\r\n' b'OK\r\n'
内容的提问来源于stack exchange,提问作者TNARGI
相关产品推荐
相关产品推荐

