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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:12:29