AT+CSQ读取GSM调制解调器信号强度及输出8原因咨询
问题解答
代码有效性结论
这段代码无法实现GSM调制解调器信号强度/质量的读取。
输出结果为8的原因
pyserial库中ser.write()方法的返回值是成功写入串口的字节总数,和调制解调器返回的信号结果没有任何关系。你发送的字符串AT+CSQ=?编码为ASCII格式后,字符总长度刚好是8,所以打印输出的8仅代表你成功向串口写入了8字节的数据。
现有代码的核心问题
- AT指令格式不符合规范:所有标准GSM调制解调器的AT指令必须以回车符
\r作为指令结尾,设备只有收到结尾符才会判定一条指令接收完成并开始执行,你当前发送的内容没有添加\r,设备根本不会识别响应这条指令。 - 缺少响应读取逻辑:代码仅实现了向串口写入数据的发送动作,完全没有编写读取串口返回数据的逻辑,自然无法获取设备返回的信号强度结果。
- 指令使用错误:
AT+CSQ=?是AT指令的测试命令,作用是查询设备支持的CSQ参数取值范围,并非查询当前实时信号强度的执行命令;要获取当前信号值,需要发送AT+CSQ指令。
修正参考代码
from time import sleep import serial ser = serial.Serial() ser.port = "COM10" ser.baudrate = 9600 ser.timeout = 1 # 设置读取超时,避免程序永久阻塞 ser.open() # 清空串口残留的输入输出缓冲区 ser.flushInput() ser.flushOutput() # 发送符合规范的信号查询指令,必须加\r结尾 ser.write('AT+CSQ\r'.encode("ascii")) # 预留少量时间等待设备响应 sleep(0.5) # 读取缓冲区中所有的返回数据 response = ser.read(ser.inWaiting()).decode("ascii") print("CSQ指令返回内容:", response) ser.close()
正常情况下设备会返回类似+CSQ: 20,0格式的结果,其中第一个数值为RSSI信号强度,取值范围0-31对应不同信号等级,数值越大信号越好,99代表信号无法检测;第二个数值为信道误码率。
内容的提问来源于stack exchange,提问作者Les Jetskii
相关产品推荐
相关产品推荐

