3、AT指令基础:蜂窝模组AT指令集详解(网络注册、TCP/UDP连接)
说实话,很多做物联网的朋友第一次接触蜂窝模组,都会被那一堆“AT”开头的命令搞懵。我当年也一样,拿着4G模组的AT指令手册,翻了几页就头大。但后来我发现,真正常用的指令其实就那么十几条。你只要把网络注册和TCP/UDP通信这两块吃透,剩下的基本就是查手册的事了。
这一章,我就带你手把手过一遍这些核心指令。咱们不搞大而全的罗列,只讲最实用的东西。
3.1 认识AT指令:你发它回
AT指令,说白了就是“Attention”。主机(比如你的MCU)发一条以“AT”开头的文本,模组收到后回复结果。就这么简单。
每条指令都以回车换行(\r\n)结尾。模组回复也以\r\n分隔。我习惯在串口调试工具里勾选“发送新行”,这样就不用手动敲回车了。
基本格式:
- 测试指令:
AT+<CMD>=?—— 查询模组支持哪些参数 - 查询指令:
AT+<CMD>?—— 查询当前参数值 - 设置指令:
AT+<CMD>=<param>—— 设置参数 - 执行指令:
AT+<CMD>—— 执行某个动作
模组的回复一般有两种:OK 表示成功,ERROR 表示失败。有些指令会先返回数据,最后再跟 OK。比如查询信号质量:
AT+CSQ
+CSQ: 19,99
OK
你看,它先返回了信号强度值,然后才说 OK。这个顺序很重要,写代码解析的时候千万别搞反了。
3.2 网络注册:让模组“上线”
模组插上SIM卡,通电后第一件事就是找网络。这个过程叫“网络注册”。我遇到过不少新手,上来就发TCP连接指令,结果一直报错。其实模组还没注册上网络呢。
咱们先看几个关键指令。
3.2.1 查询信号质量:AT+CSQ
这条指令最常用。它返回两个数字:
- 第一个数(0-31):信号强度。越大越好。一般大于15就能正常工作。
- 第二个数:误码率。99表示未知,通常不用管它。
我个人的经验是,如果 +CSQ 返回值小于10,那基本就是信号太弱,得换个位置或者加天线了。
3.2.2 查询网络注册状态:AT+CREG?
这条指令告诉你模组有没有注册上网络。回复格式如下:
+CREG: <n>,<stat>
我们主要看第二个参数 <stat>:
| stat值 | 含义 |
|---|---|
| 0 | 未注册,且模组当前不在搜索网络 |
| 1 | 已注册,本地网(这就是我们想要的状态) |
| 2 | 未注册,但模组正在搜索网络 |
| 3 | 注册被拒绝 |
| 5 | 已注册,漫游状态 |
我的习惯:上电后先循环查询 AT+CREG?,直到返回 1 或 5,再继续后面的操作。超时时间我一般设30秒,如果还注册不上,就重启模组。
3.2.3 查询附着状态:AT+CGATT?
注册上网络还不够,模组还得“附着”到GPRS/PS域,才能用TCP/IP。这条指令返回 1 表示已附着,0 表示未附着。
我曾经在一个项目里,发现模组 CREG 已经返回1了,但TCP就是连不上。折腾了半天,才发现 CGATT 还是0。所以这两个状态,你都得检查一遍。
3.3 TCP/UDP连接:让数据“跑”起来
网络注册好了,接下来就是建立连接、收发数据。大部分模组都支持AT指令直接操作TCP/UDP,不需要你写复杂的socket代码。
3.3.1 配置APN:AT+CGDCONT
在建立连接之前,得先告诉模组用哪个APN。APN就是运营商提供的接入点名称,比如移动的 cmnet。
AT+CGDCONT=1,"IP","cmnet"
这条指令的意思是:使用上下文ID为1,协议类型是IP,APN是cmnet。大部分物联网卡都支持 cmnet 或 uninet。如果你用的是专用APN,运营商应该会告诉你。
3.3.2 发起TCP连接:AT+QIOPEN(以移远模组为例)
不同厂家的模组,TCP指令略有不同。但思路是一样的。我以移远EC20/EC800系列为例,其他模组你查手册就能对应上。
AT+QIOPEN=1,0,"TCP","192.168.1.100",8080,0,1
参数说明:
- 1:上下文ID,跟上面
CGDCONT保持一致 - 0:连接索引号(0-5),你可以同时开多个连接
- "TCP":协议类型,也可以是
"UDP" - "192.168.1.100":服务器IP或域名
- 8080:端口号
- 0:本地端口号,0表示自动分配
- 1:是否开启透传模式(1开启,0关闭)
如果连接成功,模组会回复:
OK
+QIOPEN: 0,0
第二个 0 表示连接成功。如果返回非0值,那就是错误码,得去手册里查原因。
注意:透传模式(1)下,模组会把所有收到的数据直接通过串口扔给你,你发的数据也会直接发到服务器。这种模式用起来简单,但不好做协议解析。我一般只在调试时用透传,正式产品里都用非透传模式,自己控制数据帧格式。
3.3.3 发送数据:AT+QISEND
连接建立后,发数据就简单了:
AT+QISEND=0,5
> Hello
这条指令的意思是:向连接0发送5个字节的数据。模组收到后会回复 > 提示符,然后你输入数据 Hello。发送成功会返回 SEND OK。
我习惯在发送前先检查一下连接状态,用 AT+QISTATE=0,0 看看连接0是不是还活着。网络不好的时候,连接可能已经断了,但你不知道。
3.3.4 接收数据:URC上报
当服务器发数据过来时,模组会主动上报一条消息:
+QIURC: "recv",0,10
这表示连接0收到了10个字节的数据。然后你需要用 AT+QIRD=0,10 把数据读出来。
嗯,这里要注意:URC上报是异步的,你写MCU代码时得用中断或轮询来处理。我见过有人用延时等待数据,结果丢包丢得一塌糊涂。
3.4 串口调试:实战演练
光看指令记不住,你得动手试。我推荐用SSCOM或Putty这类串口工具。把模组的TX、RX、GND连到USB转串口模块上,插电脑,打开串口。
下面是一套完整的调试流程,你可以照着敲一遍:
- 检查模组是否响应:发
AT,看是否回复OK - 查信号:
AT+CSQ - 查网络注册:
AT+CREG?,直到返回1或5 - 查附着状态:
AT+CGATT?,确认是1 - 设APN:
AT+CGDCONT=1,"IP","cmnet" - 激活PDP上下文:
AT+QIACT=1(这条指令会激活网络,获取IP地址) - 查本地IP:
AT+QIACT? - 建立TCP连接:
AT+QIOPEN=1,0,"TCP","你的服务器IP",端口,0,0 - 发数据:
AT+QISEND=0,5,然后输入数据 - 收数据:等待
+QIURC上报,然后用AT+QIRD读取
避坑指南:我曾经在调试时,发现模组发 AT 都不回。查了半天,原来是串口波特率没对上。很多模组默认是115200,但有些旧模块是9600。如果你发现模组没反应,先换个波特率试试。
3.5 知识体系:一张图看懂
下面这张图,把AT指令操作蜂窝模组的完整流程串起来了。你对照着看,思路会更清晰。
你看,整个流程是线性的。上电 -> 握手 -> 注册 -> 配置 -> 连接 -> 收发。每一步都有对应的AT指令。你只要按这个顺序来,基本不会出大问题。
好了,这一章的内容就到这儿。AT指令不难,关键是多练。你拿个模组,照着上面的流程敲一遍,比看十遍书都管用。