第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指令是基础,基础打牢了,后面的事儿就好办了。