一文带你入门 AT 指令集:从串口通信到模块控制
在嵌入式开发、物联网以及通信模块调试中,有一个你迟早会遇到的重要工具 —— AT 指令。
无论是 GSM 模块打电话发短信、WiFi 模块联网、蓝牙模块配对,还是 GNSS 模块获取定位,AT 指令都扮演着人机通信的桥梁。
AT 指令能做什么?(结合模块场景)
AT 指令的本质是 “通过串口发送文本命令,直接控制模块功能”。
根据不同模块,AT 指令能完成的任务大致分为两大类:
① 移动通信模块(GSM / GPRS / LTE)
设备控制:模块开机、复位、查询版本信息
网络接入:注册运营商网络,检查信号强度
通话与短信:拨打电话、发送/接收短信
移动数据:PPP 拨号上网,建立 TCP/UDP 连接,上报数据到服务器
② 终端通信模块(WiFi / 蓝牙 / GNSS)
WiFi 模块:连接路由器、建立 TCP/UDP、MQTT
蓝牙模块:搜索、配对、数据透传
GNSS 模块:开启定位、输出经纬度、查询定位状态
大白话:AT 指令就是“模块的遥控器”。在 GSM/LTE 模块里,它能打电话、发短信、上网;
在 WiFi/蓝牙/GNSS 模块里,它能连路由、配对手机、获取定位。学会 AT 指令,就能直接操作通信模块的所有核心功能。
1. 什么是 AT 指令?
AT 指令(Attention Command)是一种用于控制调制解调器(Modem)或通信模块的命令集。
如今,它被广泛应用于:
移动模块:GSM / GPRS / LTE 模块(SIM800、Quectel、移远)
终端模块:WiFi 模块(ESP8266、ESP32)、蓝牙模块(HC-05)、GNSS 模块(Neo-6M)
本质:通过串口发送的“文本命令”,用来控制模块的行为。
大白话:AT 指令的本质就是“发文本命令,模块照做”。最早用于调制解调器,现在几乎所有通信模块都支持。
2. AT 指令的基本格式
类型 | 说明 | 示例 |
---|---|---|
测试命令 | 查询模块是否支持参数 | AT+CMD=? |
查询命令 | 读取模块当前配置 | AT+CMD? |
设置命令 | 配置模块参数 | AT+CMD=参数 |
执行命令 | 执行某操作 | AT+CMD |
通用规则:
所有命令以 AT 开头;
命令以 回车换行(\r 或 \r\n) 结束;
返回结果通常为:
OK
:执行成功ERROR
:命令错误或参数非法+CMD: xxx
:返回查询结果
大白话:AT 指令的格式很规律:测试、查询、设置、执行。记住:都要以 AT 开头、回车结尾,返回
OK
就成功。
3. 常见模块 AT 指令示例
移动模块(SIM800 为例)
AT // 测试串口是否通信正常
AT+CSQ // 查询信号强度
AT+CREG? // 查询网络注册状态
ATD10086; // 拨打电话
AT+CMGF=1 // 设置短信为文本模式
AT+CMGS="手机号" // 发送短信
WiFi 模块(ESP8266 为例)
AT // 测试模块是否响应
AT+CWMODE? // 查询当前工作模式
AT+CWMODE=1 // 设置为 Station 模式
AT+CWJAP="SSID","PWD" // 连接 WiFi
AT+CIPSTART="TCP","ip",port // 建立 TCP 连接
AT+CIPSEND=5 // 准备发送数据
GNSS 模块(ATGM 为例)
AT+CGPS=1 // 打开 GPS
AT+CGPSINFO // 获取定位信息
AT+CGPSSTATUS? // 查询定位状态
大白话:不同模块的 AT 指令大同小异:GSM 模块能打电话发短信,WiFi 模块能联网传数据,GNSS 模块能获取经纬度。就是一套“问答语言”,用在哪儿就干哪儿的事。
4. AT 指令调试工具
常见串口调试工具:
Windows:SSCOM、XCOM、SecureCRT
Arduino IDE 串口监视器(适合 ESP32、蓝牙等)
Linux:minicom、picocom
串口常见配置:
波特率:9600 / 115200(视模块而定)
数据位:8
停止位:1
校验:None
结束符:
\r
或\r\n
大白话:要和模块聊天,需要一个“串口聊天工具”。配置好波特率和结束符,才能让模块听懂你说话。
5. 实战调试技巧
判断串口是否连通:
AT
→ 返回OK
即正常模块“死机”:用
AT+RST
复位,或检查电源供电是否足够批量测试命令:用串口助手的“宏命令/脚本”功能自动发送
打包话:调试秘诀:先发
AT
看有没有OK
,不行就复位+查供电,命令多了就用脚本,省力高效。
6. 自定义 AT 指令(高级玩法)
在 STM32 / MCU 项目中,也可以仿照模块写自己的 AT 指令:
if (strncmp(cmd, "AT+LED=ON", 9) == 0) {
led_on();
send_response("OK\r\n");
} elseif (strncmp(cmd, "AT+LED=OFF", 10) == 0) {
led_off();
send_response("OK\r\n");
} else {
send_response("ERROR\r\n");
}
大白话:你不仅能用模块的 AT 指令,还能写自己的。别人只要发命令,就能控制你的设备,这就是 DIY 的乐趣。
7. 常见问题 FAQ
Q: AT 指令能发中文吗?
A: 直接不行,大多数模块只支持 ASCII,需要转 UCS2/PDU。Q: 为什么返回 ERROR?
A: 参数不合法、格式错误、模块未初始化或不支持该状态。Q: 为什么响应慢?
A: 模块需要等待初始化,比如 GSM 模块上电要 5~10 秒。
大白话:AT 指令常见坑:中文要转码;ERROR 多半是命令/状态问题;响应慢是因为模块还没准备好。