3. AT命令体系与串口通信基础
Cat1/Cat4 模组对外最核心的控制面就是 AT 命令通道。无论你后面用 PPP 拨号、MQTT、HTTP 还是 TCP 透传,第一步都是让 MCU 或 PC 通过串口与模组"对上话"。本节围绕四件事展开:AT 命令的语法与返回码、命令/响应/URC 的异步机制、串口参数与流控配置、以及用串口助手完成首次拨号上网。
一、AT 命令语法与返回码
AT 命令源自 Hayes 调制解调器时代,语法非常克制。一条命令由 AT 前缀加命令体组成,命令体分三类:
- 测试命令:
AT+CGMR=?,问"这个命令支持哪些参数",模组返回能力列表。 - 查询命令:
AT+CGMR?,问"当前值是多少"。 - 执行/设置命令:
AT+CGMR或AT+CGMR=1,执行动作或写入参数。
返回码分两类。一类是结果码:OK 表示命令被接受并执行成功,ERROR 表示语法错误或参数非法,+CME ERROR: <code> 表示设备相关错误(如 10 表示 SIM 未插入),+CMS ERROR: <code> 表示网络/短消息相关错误。另一类是信息响应:查询命令返回的 +CGMR: ... 这类带冒号的行,属于数据本身,不是结果码。
一个容易踩的坑是:命令必须以 \r 结尾,很多模组同时接受 \r\n,但只发 \n 往往不响应。串口助手里要勾选"发送新行"或手动加回车。此外,AT 命令默认不区分大小写,但参数中的字符串(如 APN)区分大小写。
二、命令、响应与 URC 的异步机制
串口是字节流,模组在同一根 RX 线上会同时吐出两类东西:你刚才那条命令的响应,以及模组主动上报的 URC(Unsolicited Result Code,非请求结果码)。典型 URC 有:
+CREG: 1:网络注册状态变化。+CGREG: 2:分组域注册状态变化。RING:来电。+CMTI: "SM",3:收到新短信。+PDP: DEACT:PDP 上下文去激活。
关键认知是:URC 可能插在你命令响应的中间。例如你发 AT+CSQ,模组可能先吐一行 +CREG: 1,再吐 +CSQ: 20,99 和 OK。因此解析逻辑不能假设"发一条收一条",而应按行缓冲,遇到 OK/ERROR 才认为当前命令结束,遇到已知 URC 前缀就单独分发处理。这是写驱动时最容易出 bug 的地方。
三、串口参数配置与流控
模组默认串口参数通常是 115200 8N1(8 数据位、无校验、1 停止位),无硬件流控。首次连接前必须确认三件事:波特率、数据格式、流控方式。若模组被改过波特率(如 AT+IPR=460800),而 PC 端仍是 115200,就会看到乱码或完全无响应。
流控分两种:硬件流控 RTS/CTS 和 软件流控 XON/XOFF。Cat1/Cat4 模组在高速率(如 921600)或大数据量透传时,强烈建议启用 RTS/CTS。原理是:模组接收缓冲快满时拉高 CTS,告诉 MCU"先别发";MCU 侧同理用 RTS 通知模组。若只接 TX/RX/GND 三根线,就必须把速率降下来,并保证 MCU 侧有足够大的接收缓冲,否则丢字节几乎必然发生。
缓冲区管理上,模组内部一般有几百字节到几 KB 的接收 FIFO。当 MCU 发送长命令(如 AT+HTTPDATA 后跟大段数据)时,若 MCU 发送速度超过模组处理速度,就会溢出。工程做法是:发送前查询 AT+IFC? 确认流控设置,长数据分片发送,每片之间留出等待 > 提示符或 OK 的时间。
四、用串口助手完成首次拨号上网
下面给出一套可直接照做的首次拨号流程。硬件连接:模组 TXD→USB-TTL 的 RXD,模组 RXD→USB-TTL 的 TXD,GND 共地,模组供电需能提供 2A 峰值(Cat1 发射瞬间电流较大,USB 口直供常导致重启)。串口助手设置:115200、8N1、无流控、发送新行 \r\n。
AT → OK // 握手,确认串口通
ATE0 → OK // 关闭回显,避免响应里混入命令本身
AT+CPIN? → +CPIN: READY OK // SIM 卡就绪
AT+CSQ → +CSQ: 20,99 OK // 信号质量,20 约 -73dBm,可用
AT+CREG? → +CREG: 0,1 OK // 已注册到网络
AT+CGREG? → +CGREG: 0,1 OK // 已注册到分组域
AT+CGATT? → +CGATT: 1 OK // 已附着 GPRS
AT+CGDCONT=1,"IP","cmnet" → OK // 设置 PDP 上下文,APN 按运营商填
ATD*99# → CONNECT 115200 // 拨号,进入数据态
看到 CONNECT 后,串口就进入数据态,此时再发 AT 命令不会响应,必须用 +++(前后各留约 1 秒静默)切回命令态,模组返回 OK。若 ATD*99# 返回 NO CARRIER,常见原因是 APN 错误、未附着 GPRS 或信号太差;若返回 ERROR,检查 AT+CGDCONT 的 cid 是否与拨号一致。
AT、ATE0、AT+CPIN?、AT+CSQ 四条,确认串口和 SIM 都正常,再往下走。这样能把"串口不通"和"网络不通"两类问题分开定位。CONNECT 后的数据态规则处理,或发送速率超过了模组 FIFO 承受能力。把这一节串起来看:AT 语法决定你怎么"说",返回码决定你怎么"听",URC 机制决定你怎么"不被插话打断",串口参数和流控决定"说得清不清楚",而首次拨号则是把前面所有环节跑通的一次端到端验证。后续所有联网功能,都建立在这条命令通道稳定可靠的基础之上。