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 的地方。

AT 命令 / 响应 / URC 在串口上的异步交织 时间 MCU / 串口助手(发送) AT+CSQ\r AT+CGATT=1\r ATD*99#\r 等待 CONNECT 模组(接收 / 上报) +CSQ: 20,99 → OK +CREG: 1(URC 插入) OK CONNECT 115200 URC 可随时插入命令响应之间,解析须按行缓冲、以 OK/ERROR 界定命令结束

三、串口参数配置与流控

模组默认串口参数通常是 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 都正常,再往下走。这样能把"串口不通"和"网络不通"两类问题分开定位。
拨号成功后不要立刻用串口助手发大量数据测试吞吐,先确认流控和缓冲策略。很多"拨号成功但传数据丢包"的问题,根源是 MCU 侧没有按 CONNECT 后的数据态规则处理,或发送速率超过了模组 FIFO 承受能力。

把这一节串起来看:AT 语法决定你怎么"说",返回码决定你怎么"听",URC 机制决定你怎么"不被插话打断",串口参数和流控决定"说得清不清楚",而首次拨号则是把前面所有环节跑通的一次端到端验证。后续所有联网功能,都建立在这条命令通道稳定可靠的基础之上。