4. AT指令基础:AT指令语法、常用AT指令集(3GPP TS 27.007)、模组厂商私有AT指令
做LTE模组联调,AT指令是绕不开的基本功。说白了,AT指令就是咱们通过串口跟模组对话的“通用语言”。你发一条指令,模组回一个响应,一来一回,控制就完成了。
我刚开始带项目那会儿,有个同事把AT指令的格式写错了,结果模组死活没反应。他折腾了一下午,最后发现是少了个回车换行。嗯,这种坑踩过一次就记住了。
4.1 AT指令的语法规则
AT指令的格式其实很简单。每条指令都以“AT”开头,后面跟着具体命令,最后以回车换行(\r\n)结束。模组收到后,会返回响应。
基本格式长这样:
AT<命令>\r\n
响应格式分两种:
- 成功:返回
OK - 失败:返回
ERROR或具体错误码
举个例子,测试模组是否正常通信:
发送:AT\r\n
响应:OK
AT指令还分几种类型,我整理了一张表,方便你对照:
| 类型 | 格式 | 说明 | 示例 |
|---|---|---|---|
| 测试指令 | AT+<命令>=? | 查询命令支持的参数范围 | AT+CGMI=? |
| 读取指令 | AT+<命令>? | 查询当前参数值 | AT+CGMI? |
| 设置指令 | AT+<命令>=<参数> | 设置参数值 | AT+CGMI="Huawei" |
| 执行指令 | AT+<命令> | 执行无参数的操作 | AT+CGMI |
我的小习惯:调试时先用测试指令(=?)看看参数范围,再用读取指令(?)确认当前值,最后才用设置指令。这样能避免参数越界导致的奇怪问题。
4.2 3GPP TS 27.007 标准AT指令集
3GPP TS 27.007 是国际标准,定义了所有蜂窝模组必须支持的基础指令。不管你用哪个厂家的模组,这些指令基本通用。
常用的标准指令有这些:
- AT+CGMI:查询模组厂商
- AT+CGMM:查询模组型号
- AT+CGMR:查询固件版本
- AT+CGSN:查询IMEI号
- AT+CSQ:查询信号强度
- AT+CREG:查询网络注册状态
- AT+CGATT:查询或设置GPRS附着状态
- AT+CGPADDR:查询PDP地址(IP地址)
举个例子,查询信号强度:
发送:AT+CSQ\r\n
响应:+CSQ: 28,0
OK
第一个数字28代表信号强度(范围0-31),越大越好。第二个数字0代表误码率。我在项目现场遇到过信号只有5的情况,那基本就是没信号,得换位置或者加天线。
注意:标准指令虽然通用,但不同模组对某些参数的支持可能有细微差异。比如AT+CSQ返回的第二个参数,有些模组固定返回99(未知),有些返回0。别想当然,先测一下。
4.3 模组厂商私有AT指令
标准指令只能做基础操作。真要发挥模组的全部能力,还得靠厂商的私有指令。比如配置TCP/IP连接、MQTT参数、HTTP请求、GPS定位等,这些标准里没有,厂商自己加的。
我拿几个主流厂商举例:
| 厂商 | 私有指令前缀 | 典型功能 |
|---|---|---|
| 移远(Quectel) | AT+QIOPEN, AT+QISEND | TCP/UDP连接、数据发送 |
| 广和通(Fibocom) | AT+FSCONN, AT+FSWRITE | Socket连接、数据写入 |
| 中移(China Mobile) | AT+CMQTTSTART, AT+CMQTTCONNECT | MQTT客户端操作 |
| 华为(Huawei) | AT^IPOPEN, AT^IPSEND | IP连接、数据发送 |
举个例子,用移远模组建立TCP连接:
发送:AT+QIOPEN="TCP","192.168.1.100",8080\r\n
响应:OK
+QIOPEN: 0,0
第一个0是连接ID,第二个0表示成功。如果返回非0值,那就是失败了。我曾经遇到返回3的情况,查手册才知道是IP地址格式不对——多写了个空格。
核心建议:拿到新模组,第一件事就是去官网下载AT指令手册。别偷懒,手册里藏着很多坑。我习惯把常用指令整理成表格,贴在工位上,调试时一眼就能看到。
4.4 AT指令的知识体系
为了让你更直观地理解AT指令的整体结构,我画了一张图:
4.5 实战中的避坑指南
AT指令看着简单,实际联调时坑不少。我把自己踩过的坑总结一下:
- 回车换行不能少:很多新手只发“AT”不加\r\n,模组没反应就怀疑模组坏了。其实模组在等结束符。
- 响应要读完:发完指令别急着发下一条。模组可能返回多行数据,没读完就发新指令,会导致数据错乱。
- 超时处理:有些指令执行时间长(比如AT+CGATT),要设置合理的超时时间。我一般设5秒,不够再加。
- 大小写敏感:AT指令不区分大小写,但参数值可能区分。比如APN名称,大写小写不一样。
我曾经踩过的坑:有一次用AT+QIOPEN建TCP连接,一直返回ERROR。查了半天,发现是服务器IP写成了“192.168.1.100”后面多了个空格。模组把空格当成IP的一部分,当然连不上。从那以后,我每次发指令前都会用串口工具先看一遍原始数据。
好了,AT指令的基础就这些。记住:语法是骨架,标准指令是通用工具,私有指令是专属武器。三者结合,你就能跟任何LTE模组顺畅对话了。