4、蜂窝模组AT指令集:基础AT指令、网络连接指令、TCP/UDP数据传输指令
AT指令,说白了就是咱们工程师和模组对话的“黑话”。模组上电后,它不会主动告诉你“我准备好了”,你得先发个招呼。我个人习惯,拿到一个新模组,第一件事就是敲个 AT 回车,看它回不回 OK。回了,说明串口通了,模组活着。
核心原则:AT指令以 AT 开头,以 \r\n(回车换行)结尾。模组返回的响应也以 \r\n 分隔,最后以 OK 或 ERROR 结束。
4.1 基础AT指令:先让模组“开口说话”
基础指令不多,但每个都是后面所有操作的基石。我刚开始用4G模组时,就因为在 ATE0 上栽过跟头——回显没关,日志里全是自己发的指令,调试信息根本看不清。
| 指令 | 功能 | 典型响应 |
|---|---|---|
AT |
测试握手 | OK |
ATE0 |
关闭回显 | OK |
ATE1 |
开启回显 | OK |
AT+CGMI |
查询模组制造商 | Quectel |
AT+CGMM |
查询模组型号 | EC200U |
AT+CGMR |
查询固件版本 | EC200UCNAAR01A01M08 |
AT+CSQ |
查询信号强度 | +CSQ: 19,99 |
AT+CCID |
查询SIM卡ICCID | 89861121200012345678 |
小技巧:AT+CSQ 返回的第一个数值是信号强度,范围 0-31。数值越大信号越好。低于 10 的话,建议检查天线或位置。我在一个工厂项目里遇到过,信号值一直在 5-8 之间跳,后来发现是天线被金属机箱挡住了。
4.2 网络连接指令:让模组“连上世界”
基础指令确认模组活着,接下来就是让它注册上网络。这一步卡住的人最多。你想想看,模组能打电话吗?不一定。但数据业务必须走 PS域(分组交换域)。
我习惯的流程是:先查SIM卡状态,再查网络注册,最后激活PDP上下文。一步都不能省。
4.2.1 查询SIM卡与网络注册
AT+CPIN? // 查询SIM卡状态
+CPIN: READY // 返回 READY 表示SIM卡正常
AT+CREG? // 查询网络注册状态(电路域)
+CREG: 0,1 // 第二个参数 1 表示已注册到本地网
AT+CGREG? // 查询GPRS网络注册状态(分组域)
+CGREG: 0,1 // 1 表示已注册,5 表示漫游
AT+CGATT? // 查询是否附着GPRS业务
+CGATT: 1 // 1 表示已附着
注意:有些模组用 AT+CEREG? 代替 AT+CGREG?,尤其是支持 LTE 的模组。具体看模组手册。我曾经在切换模组型号时忘了查这个,结果 CGREG 一直返回 ERROR,折腾了半天才发现指令不对。
4.2.2 激活PDP上下文
PDP上下文,说白了就是模组和基站之间建立的一条“数据通道”。不激活它,你发不了TCP/UDP数据。
AT+CGDCONT=1,"IP","CMNET" // 定义PDP上下文:CID=1,协议IP,APN=CMNET
OK
AT+CGACT=1,1 // 激活CID=1的PDP上下文
OK
AT+CGACT? // 查询激活状态
+CGACT: 1,1 // CID=1,状态=1(已激活)
这里有个坑:APN(接入点名称)必须和SIM卡匹配。移动卡通常是 CMNET,联通是 3GNET 或 UNINET,电信是 CTNET。如果APN填错了,CGACT 会返回 ERROR。
4.3 TCP/UDP数据传输指令:真正开始“收发数据”
网络通了,PDP激活了,接下来就是建立Socket连接。大部分蜂窝模组都支持 AT+QISTATE 或 AT+CIPSTART 这类指令。我以移远模组为例,因为用得最多。
4.3.1 建立TCP连接
AT+QIOPEN=1,0,"TCP","192.168.1.100",8080,0,1
// 参数说明:
// 1 -> 使用的PDP上下文CID
// 0 -> Socket索引(0-5,最多6个)
// TCP -> 协议类型
// 192.168.1.100 -> 服务器IP
// 8080 -> 服务器端口
// 0 -> 本地端口(0表示自动分配)
// 1 -> 连接模式(1表示非透传)
+QIOPEN: 0,0 // 返回:Socket索引=0,错误码=0(成功)
关键点:连接模式分为 透传模式 和 非透传模式。非透传模式下,每次收发数据都要带 AT+QISEND 指令;透传模式则像串口直连,数据直接发。我个人偏好非透传模式,调试方便,出错时能清楚看到指令交互过程。
4.3.2 发送数据
AT+QISEND=0,5 // 向Socket 0发送5字节数据
> // 模组返回 '>' 提示符,等待输入数据
HELLO // 输入5字节数据(不需要回车)
OK // 发送成功
// 查询发送缓冲区剩余空间
AT+QISEND=0,0 // 返回剩余可发送字节数
+QISEND: 0,1460 // 还有1460字节可用
4.3.3 接收数据
模组收到数据时,会主动上报 +QIURC: "recv",0,10,表示Socket 0收到了10字节数据。你需要用 AT+QIRD 去读取。
// 模组主动上报
+QIURC: "recv",0,10
// 读取数据
AT+QIRD=0,10
+QIRD: 0,10
HELLO WORLD // 实际接收到的数据
OK
4.3.4 UDP与TCP的区别
UDP不需要建立连接,直接发就行。指令几乎一样,只是协议类型换成 UDP。
// UDP连接(其实UDP不需要“连接”,但模组接口统一了)
AT+QIOPEN=1,0,"UDP","192.168.1.100",8080,0,1
// 发送UDP数据
AT+QISEND=0,5
> HELLO
OK
UDP有个特点:你发出去,对方收没收到,模组不保证。TCP有重传机制,UDP没有。所以,如果你的应用场景是传感器上报数据,丢一包无所谓,用UDP;如果是控制指令,必须可靠,用TCP。
4.4 本章知识体系
下面这张图,把AT指令的调用流程串起来了。从模组上电到数据收发,每一步都有对应的指令。
4.5 避坑指南
做蜂窝模组开发,坑不少。我把自己踩过的几个列出来,你遇到了能少走弯路。
- 串口缓冲区溢出:模组上报
+QIURC时,如果你不及时读取,缓冲区满了就会丢数据。我建议在主循环里定期检查串口接收,或者用中断方式处理。 - AT指令超时:网络操作(如
AT+CGACT)可能耗时几秒。不要用短超时,我一般设 10 秒以上。 - APN写死的问题:不同运营商的APN不同。如果产品要支持多运营商,最好做成可配置的,或者用
AT+CGDCONT?先查询当前SIM卡的默认APN。 - 透传模式下的退出:透传模式下,想退出数据模式发AT指令,需要发送
+++(不加回车),然后等 1 秒再发AT。这个时序很关键,快了慢了都不行。
我的习惯:调试阶段全程用非透传模式。等所有功能稳定了,再根据需求决定是否切到透传。这样出了问题,日志里能清楚看到每一条指令和响应,定位问题快得多。
4.6 小结
AT指令集是蜂窝模组开发的入门必修课。基础指令确认模组活着,网络指令让它连上基站,数据传输指令完成真正的业务交互。这三层,一层层往上走,每一步都有对应的指令和响应。你只要把流程走通一次,后面换模组型号、换运营商,无非是改几个参数的事。