如何用Python通过串口接听电话?串口接听命令及问题求助
解决串口接听GSM电话的问题
嘿,我来帮你搞定这个问题!你现在用OK命令是没法接听电话的——GSM模块有专门的接听电话AT指令:ATA,这才是让模块接听来电的正确命令。
你的代码存在两个关键问题:
serial.readline()返回的是字节类型(bytes),直接和字符串"RING"比较永远不会相等,得先解码成字符串并去除末尾的\r\n换行符。- 发送
OK完全不对,GSM模块只认标准AT指令,接听必须用ATA,而且要加上换行符(\r\n)让模块识别为完整指令。
修改后的可运行代码
import serial ser = serial.Serial() ser.port='COM3' ser.baudrate=9600 # 多数GSM模块默认是8N1(8位数据位、无校验、1位停止位),如果你的模块参数不同要调整 ser.bytesize=serial.EIGHTBITS ser.parity=serial.PARITY_NONE ser.stopbits=serial.STOPBITS_ONE try: ser.open() print("串口已打开,等待来电...") while True: # 读取串口数据并解码,同时去除首尾空白(包括\r\n) lectura = ser.readline().decode('utf-8', errors='ignore').strip() if lectura: print(f"模块消息: {lectura}") if lectura == "RING": print("检测到来电,尝试接听...") # 发送ATA指令,必须转成字节并加上换行符 ser.write(b"ATA\r\n") # 读取模块的响应,确认是否成功接听 response = ser.readline().decode('utf-8', errors='ignore').strip() print(f"模块响应: {response}") finally: # 确保程序退出时关闭串口 if ser.is_open: ser.close() print("串口已关闭")
额外注意事项
- 可以先发送
AT指令测试模块通信:ser.write(b"AT\r\n"),如果模块返回OK,说明串口通信正常。 - 部分模块需要开启来电提示,发送
AT+CLIP=1\r\n后,来电时会返回类似RING\r\n+CLIP:"13xxxxxxxxx",129,"",,"",0的消息,能看到来电号码。 - 如果还是出现
NO CARRIER,可能是:- 来电方在你发送
ATA前已经挂断 - GSM模块未成功注册到移动网络,可以发送
AT+CREG?查询注册状态,返回+CREG:0,1或+CREG:0,5表示注册成功。
- 来电方在你发送
内容的提问来源于stack exchange,提问作者Javier Esquivel
相关产品推荐
相关产品推荐

