Skip to content

AT 指令开发指南

AT 指令基础

AT 指令(Attention Commands)源自 Hayes 调制解调器,是蜂窝模组最基础的控制接口。即使使用 QuecOpen/QuecPython,了解 AT 指令也是必要的。

AT 指令格式

基本格式:
  AT<命令>[=<参数>]<CR>

响应格式:
  <CR><LF><响应内容><CR><LF>
  OK 或 ERROR

命令类型:
  AT+CMD      → 执行命令
  AT+CMD?     → 查询当前值
  AT+CMD=?    → 查询支持的参数范围
  AT+CMD=<值> → 设置参数

基础 AT 指令

bash
# 测试通信
AT
# 响应:OK

# 查询厂商信息
AT+GMI
# 响应:Quectel

# 查询模组型号
AT+GMM
# 响应:EC600M-CN

# 查询固件版本
AT+GMR
# 响应:EC600MCNAAR01A01M08_OCPU_BETA0902

# 查询 IMEI
AT+GSN
# 响应:867584030123456

# 查询 IMSI
AT+CIMI
# 响应:460001234567890

# 查询 ICCID(SIM 卡号)
AT+QCCID
# 响应:+QCCID: 89860012345678901234

网络相关 AT 指令

网络注册

bash
# 查询网络注册状态
AT+CREG?
# +CREG: 0,1
# 第一个参数:0=不主动上报,1=主动上报,2=主动上报+位置信息
# 第二个参数:0=未注册,1=已注册本地,2=搜索中,3=注册被拒,5=漫游

# 查询 EPS 网络注册(4G/5G)
AT+CEREG?
# +CEREG: 0,1

# 查询当前运营商
AT+COPS?
# +COPS: 0,0,"CHINA MOBILE",7
# 参数:选择模式,格式,运营商名称,接入技术(7=LTE)

# 手动选择运营商
AT+COPS=1,2,"46000"  # 强制注册中国移动

# 自动选择运营商
AT+COPS=0

信号质量

bash
# 查询 RSSI(信号强度指示)
AT+CSQ
# +CSQ: 20,0
# RSSI 值:0-31(31=最强),99=未知
# 转换:RSSI(dBm) = -113 + 2 × 值
# 20 → -113 + 40 = -73dBm

# 查询扩展信号质量(推荐)
AT+QCSQ
# +QCSQ: "LTE",-75,-8,15,-95
# 参数:接入技术,RSRP,RSRQ,SINR,RSSI

# 信号质量判断:
# RSRP > -80dBm:优秀
# -80 ~ -100dBm:良好
# -100 ~ -110dBm:一般
# < -110dBm:差

# 查询服务小区详细信息
AT+QENG="servingcell"
# +QENG: "servingcell","NOCONN","LTE","FDD",460,00,1A2B3C,100,1,3,4,-75,-8,15,-95,11,-,-

数据连接

bash
# 配置 PDP 上下文(APN)
AT+CGDCONT=1,"IP","cmnet"
# 参数:上下文ID,协议类型,APN

# 激活数据连接
AT+CGACT=1,1
# 参数:激活(1)/去激活(0),上下文ID

# 查询 IP 地址
AT+CGPADDR=1
# +CGPADDR: 1,"10.123.45.67"

# 去激活数据连接
AT+CGACT=0,1

TCP/UDP 通信

QIOPEN/QISEND(推荐)

bash
# 打开 TCP 连接
AT+QIOPEN=1,0,"TCP","server.example.com",8080,0,1
# 参数:上下文ID,连接ID,协议,地址,端口,本地端口,访问模式
# 访问模式:0=缓冲,1=直接推送,2=透传

# 等待连接成功(URC)
# +QIOPEN: 0,0  (连接ID=0,错误码=0表示成功)

# 发送数据
AT+QISEND=0,13
> Hello, World!
# 等待 > 提示符后输入数据
# 响应:SEND OK

# 接收数据(直接推送模式,URC 自动上报)
# +QIURC: "recv",0,5
# Hello

# 关闭连接
AT+QICLOSE=0

# 查询连接状态
AT+QISTATE=1,0
# +QISTATE: 0,"TCP","server.example.com",8080,0,2,1,0,"wwan0"

UDP 通信

bash
# 打开 UDP 连接
AT+QIOPEN=1,0,"UDP","192.168.1.100",5000,0,1

# 发送 UDP 数据
AT+QISEND=0,5
> Hello

# 发送到指定地址(无连接 UDP)
AT+QISEND=0,5,"192.168.1.200",5001
> Hello

MQTT AT 指令

bash
# 打开 MQTT 网络
AT+QMTOPEN=0,"broker.emqx.io",1883
# +QMTOPEN: 0,0  (成功)

# 连接 MQTT 服务器
AT+QMTCONN=0,"clientID","username","password"
# +QMTCONN: 0,0,0  (成功)

# 订阅主题
AT+QMTSUB=0,1,"sensor/cmd",0
# +QMTSUB: 0,1,0,0  (成功)

# 发布消息
AT+QMTPUBEX=0,0,0,0,"sensor/data",25
> {"temperature":25.6}
# +QMTPUBEX: 0,0,0  (成功)

# 接收消息(URC 自动上报)
# +QMTRECV: 0,0,"sensor/cmd",10,{"cmd":"on"}

# 断开连接
AT+QMTDISC=0

# 关闭网络
AT+QMTCLOSE=0

HTTP AT 指令

bash
# 配置 HTTP URL
AT+QHTTPURL=30,80
> http://httpbin.org/get
# 参数:URL长度,超时时间(秒)

# 发送 GET 请求
AT+QHTTPGET=80
# +QHTTPGET: 0,200,256  (成功,HTTP 200,响应长度 256 字节)

# 读取响应
AT+QHTTPREAD=80
# +QHTTPREAD: 0
# {
#   "headers": {...},
#   "url": "http://httpbin.org/get"
# }
# OK

# POST 请求
AT+QHTTPURL=35,80
> http://httpbin.org/post

AT+QHTTPPOST=25,80,80
> {"key":"value","num":42}
# +QHTTPPOST: 0,200,512

短信 AT 指令

bash
# 设置短信格式(文本模式)
AT+CMGF=1

# 设置字符集
AT+CSCS="GSM"

# 发送短信
AT+CMGS="+8613800138000"
> Hello, this is a test SMS!
# 按 Ctrl+Z(0x1A)发送
# +CMGS: 1  (消息引用号)

# 读取短信
AT+CMGR=1  # 读取第1条短信

# 列出所有短信
AT+CMGL="ALL"

# 删除短信
AT+CMGD=1  # 删除第1条
AT+CMGD=1,4  # 删除所有短信

电源管理 AT 指令

bash
# 查询电源状态
AT+CBC
# +CBC: 0,85,4100
# 参数:充电状态,电量百分比,电压(mV)

# 正常关机
AT+QPOWD=1

# 进入飞行模式(关闭射频)
AT+CFUN=4

# 恢复正常模式
AT+CFUN=1

# 配置慢时钟(省电)
AT+QSCLK=1

# 查询模组温度
AT+QTEMP
# +QTEMP: "XO_THERM",35,"PA_THERM",38,"PA_THERM1",36

AT 指令调试工具

QCOM(移远串口调试工具)

QCOM 是移远提供的 Windows 串口调试工具:
  - 支持 AT 指令发送和响应显示
  - 支持日志抓取和保存
  - 支持脚本自动化测试
  - 下载:移远官网 → 工具下载

使用 Python 自动化测试

python
import serial
import time

class ATClient:
    def __init__(self, port, baudrate=115200):
        self.ser = serial.Serial(port, baudrate, timeout=1)
    
    def send(self, cmd, timeout=5):
        """发送 AT 指令并等待响应"""
        self.ser.write((cmd + '\r\n').encode())
        
        response = ""
        start = time.time()
        
        while time.time() - start < timeout:
            if self.ser.in_waiting:
                data = self.ser.read(self.ser.in_waiting).decode('utf-8', errors='ignore')
                response += data
                
                if 'OK\r\n' in response or 'ERROR\r\n' in response:
                    break
            time.sleep(0.1)
        
        return response.strip()
    
    def close(self):
        self.ser.close()

# 使用示例
client = ATClient('COM3')

# 基本测试
print(client.send('AT'))
print(client.send('AT+GMM'))
print(client.send('AT+CEREG?'))
print(client.send('AT+QCSQ'))

client.close()

褚成志的笔记