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转串口模块上,插电脑,打开串口。

下面是一套完整的调试流程,你可以照着敲一遍:

  1. 检查模组是否响应:发 AT,看是否回复 OK
  2. 查信号:AT+CSQ
  3. 查网络注册:AT+CREG?,直到返回1或5
  4. 查附着状态:AT+CGATT?,确认是1
  5. 设APN:AT+CGDCONT=1,"IP","cmnet"
  6. 激活PDP上下文:AT+QIACT=1(这条指令会激活网络,获取IP地址)
  7. 查本地IP:AT+QIACT?
  8. 建立TCP连接:AT+QIOPEN=1,0,"TCP","你的服务器IP",端口,0,0
  9. 发数据:AT+QISEND=0,5,然后输入数据
  10. 收数据:等待 +QIURC 上报,然后用 AT+QIRD 读取

避坑指南:我曾经在调试时,发现模组发 AT 都不回。查了半天,原来是串口波特率没对上。很多模组默认是115200,但有些旧模块是9600。如果你发现模组没反应,先换个波特率试试。

3.5 知识体系:一张图看懂

下面这张图,把AT指令操作蜂窝模组的完整流程串起来了。你对照着看,思路会更清晰。

蜂窝模组AT指令操作流程 上电 & 串口初始化 AT 测试(握手) 网络注册:AT+CSQ / AT+CREG? / AT+CGATT? 配置APN & 激活PDP:AT+CGDCONT / AT+QIACT 建立TCP/UDP连接:AT+QIOPEN 数据收发:AT+QISEND / +QIURC / AT+QIRD 提示:每一步都必须确认返回OK,否则不要进入下一步。网络注册失败时,检查SIM卡和天线。

你看,整个流程是线性的。上电 -> 握手 -> 注册 -> 配置 -> 连接 -> 收发。每一步都有对应的AT指令。你只要按这个顺序来,基本不会出大问题。

好了,这一章的内容就到这儿。AT指令不难,关键是多练。你拿个模组,照着上面的流程敲一遍,比看十遍书都管用。