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指令的调用流程串起来了。从模组上电到数据收发,每一步都有对应的指令。

蜂窝模组AT指令调用流程 蜂窝模组AT指令调用流程 模组上电 基础AT指令 (AT, ATE, AT+CSQ) SIM卡与网络注册 (AT+CPIN, AT+CREG) 激活PDP上下文 (AT+CGACT) 建立Socket连接 (AT+QIOPEN) TCP/UDP数据传输 (AT+QISEND) 每一步都必须成功,才能进入下一步。如果某一步返回 ERROR,先排查原因再继续。

4.5 避坑指南

做蜂窝模组开发,坑不少。我把自己踩过的几个列出来,你遇到了能少走弯路。

  • 串口缓冲区溢出:模组上报 +QIURC 时,如果你不及时读取,缓冲区满了就会丢数据。我建议在主循环里定期检查串口接收,或者用中断方式处理。
  • AT指令超时:网络操作(如 AT+CGACT)可能耗时几秒。不要用短超时,我一般设 10 秒以上。
  • APN写死的问题:不同运营商的APN不同。如果产品要支持多运营商,最好做成可配置的,或者用 AT+CGDCONT? 先查询当前SIM卡的默认APN。
  • 透传模式下的退出:透传模式下,想退出数据模式发AT指令,需要发送 +++(不加回车),然后等 1 秒再发 AT。这个时序很关键,快了慢了都不行。

我的习惯:调试阶段全程用非透传模式。等所有功能稳定了,再根据需求决定是否切到透传。这样出了问题,日志里能清楚看到每一条指令和响应,定位问题快得多。

4.6 小结

AT指令集是蜂窝模组开发的入门必修课。基础指令确认模组活着,网络指令让它连上基站,数据传输指令完成真正的业务交互。这三层,一层层往上走,每一步都有对应的指令和响应。你只要把流程走通一次,后面换模组型号、换运营商,无非是改几个参数的事。