第3章:AT指令集入门

AT指令,说白了就是咱们嵌入式设备和模块之间对话的“通用语言”。我刚开始做NB-IoT那会儿,觉得这东西太简单了,不就是发几个字符串嘛。后来踩了不少坑才明白——AT指令看似简单,里面的门道可不少。

3.1 AT指令的基本格式

AT指令的格式其实很固定。我习惯把它拆成三部分来看:

  • 前缀:几乎都是“AT”开头,代表Attention
  • 主体:具体的命令,比如+CGATT、+CSQ
  • 结束符:一般是回车换行(\r\n)

举个例子,查询信号质量的指令:

AT+CSQ\r\n

模块收到后会回复:

+CSQ: 20,0

OK

嗯,这里要注意——不同的模块对结束符的处理可能不一样。有些模块认\r\n,有些只认\r。我在一个项目里就吃过这个亏,发指令死活没反应,折腾了半天才发现是结束符的问题。

3.2 AT指令的分类

AT指令大体上可以分成三类。我个人习惯这么记:

3.2.1 基础指令

这类指令用来做最基本的设备控制。比如:

  • AT:测试通信是否正常,返回OK就说明通了
  • AT+CGMI:查询模块制造商
  • AT+CGMM:查询模块型号
  • AT+CGMR:查询固件版本

我记得有一次客户反馈设备连不上网,我第一件事就是发AT指令。结果模块没反应——原来是电源没焊好。你看,基础指令有时候就是最好的调试工具。

3.2.2 网络指令

这类指令负责网络相关的操作。NB-IoT里最常用的有:

  • AT+CGATT:附着网络(0=分离,1=附着)
  • AT+CSQ:查询信号质量
  • AT+CEREG:查询网络注册状态
  • AT+CGDCONT:配置PDP上下文

你想想看,设备连不上网的时候,你该查哪个指令?我一般先查AT+CSQ看信号,再查AT+CEREG看注册状态。这两步走完,80%的问题都能定位到。

3.2.3 数据指令

数据收发就靠它们了:

  • AT+NSOST:发送UDP数据
  • AT+NSORF:接收UDP数据
  • AT+NMGS:发送数据到平台

这里有个坑——不同厂商的模块,数据指令的格式可能不一样。华为的模块用AT+NMGS,移远的可能就用AT+QISEND。所以换模块的时候,一定要仔细看数据手册。

3.3 常用AT指令详解

下面这几个指令,是我在项目中用得最多的。我挑几个重点说说:

3.3.1 AT+CSQ - 信号质量查询

这个指令返回两个值:信号强度和误码率。信号强度范围是0-31,数值越大越好。我一般这么判断:

信号强度 含义
0-9 很差,基本没法用
10-19 能用,但不太稳定
20-31 良好,正常工作

我曾经在一个地下车库的项目里,信号强度只有5。当时想了很多办法——换天线、加放大器,最后发现换个位置就好了。所以说,信号问题有时候不是硬件能解决的。

3.3.2 AT+CGATT - 网络附着

这个指令控制设备是否附着到网络。我建议在设备初始化的时候,先发AT+CGATT=0断开网络,等所有配置都完成了,再发AT+CGATT=1附着。这样做的好处是——避免配置过程中网络状态不稳定。

3.3.3 AT+CEREG - 网络注册状态

返回值有几种:

  • 0:未注册
  • 1:已注册,本地网
  • 2:正在搜索
  • 3:注册被拒绝
  • 5:已注册,漫游

嗯,这里要注意——如果返回3,说明SIM卡有问题或者网络不允许接入。我遇到过好几次,客户说设备连不上,结果一查是SIM卡欠费了。

3.4 AT指令的调试方法

调试AT指令,说白了就是“发一条,看一条”。我常用的方法有:

3.4.1 串口助手调试

这是最直接的方法。我习惯用SSCOM或者Putty,设置好波特率(一般是9600或115200),然后手动发指令。调试的时候注意几点:

  • 每条指令后面加回车换行
  • 等待模块回复后再发下一条
  • 注意看回复里有没有ERROR

3.4.2 日志分析

在代码里加日志输出,把发的指令和收到的回复都打印出来。我一般这么写:

// 发送AT指令
send_at_cmd("AT+CSQ\r\n");
// 等待回复
recv = wait_response(5000);
// 打印日志
printf("[AT] Send: AT+CSQ\r\n");
printf("[AT] Recv: %s\r\n", recv);

这样做的好处是——出了问题可以翻日志,不用每次都连串口线。

3.4.3 超时处理

AT指令的回复时间不确定。有些指令几毫秒就回了,有些可能要几秒。我建议:

  • 基础指令:超时设500ms
  • 网络指令:超时设5-10秒
  • 数据指令:超时设30秒以上

我曾经在一个项目里,网络附着指令设了3秒超时,结果设备老是附着失败。后来改成10秒,问题就解决了。你想想看,网络环境不好的时候,模块需要更多时间去注册。

核心要点:

  • AT指令格式固定:AT+命令\r\n
  • 分类记:基础、网络、数据
  • 调试三步走:串口助手、日志、超时处理

我的小技巧:

调试的时候,先把所有指令在串口助手里手动跑一遍。确认每条指令都能正常回复了,再写到代码里。这样能省很多排查时间。

避坑指南:

我曾经在一个量产项目里,发现部分设备AT指令回复异常。查了半天,原来是串口波特率设置错了。模块默认是9600,代码里写的是115200。所以——初始化的时候,一定要先确认波特率匹配。

好了,AT指令这块儿就先说到这儿。下一章咱们聊聊NB-IoT的网络附着流程,到时候会用到今天讲的这些指令。记住一句话——AT指令是基础,基础打牢了,后面的事儿就好办了。