4G模组AT指令:被电扯淡的调试过程折磨到怀疑人生
先说结论
移远 EC200 模组联网的 90% 问题出在三个地方——电源不稳、波特率不对、没插 SIM 卡。先查这三项,再看 AT 指令。
调试顺序:硬件通 → SIM卡 → 信号 → 注网 → APN → 连接。每一步用 AT 指令确认通过再做下一步,跳步是调试的大敌。
一、硬件先决条件
1.1 电源
- EC200 系列峰值电流2A(发射时)。3.3V LDO 供不动,必须用 DC-DC
- VCC 电压范围3.3V-4.3V,建议3.8V
- 去耦电容:100μF 电解 + 10μF 陶瓷 + 100nF 陶瓷,紧贴 VCC 引脚
1.2 SIM 卡
- SIM 卡座 VDD别和 MCU VDD 混。模组会给 SIM 卡供电(1.8V 或 3V)
- SIM 卡数据线串22Ω 电阻,减少信号过冲
1.3 UART
- 波特率默认115200。模组自适应波特率,但建议固定
- TX/RX/GND 三根线必须接。硬件流控(RTS/CTS)可选,大数据量建议接
二、AT 指令调试流程
第一步:串口能不能通
AT OK如果串口返回OK,说明模组上电正常,UART 通信 OK。如果什么都没返回:
- 检查 TX/RX 是否接反
- 检查波特率(试 9600、115200、921600)
- 检查模组电源指示灯是否亮
- 检查 PWRKEY 引脚是否需要拉低开机
第二步:查 SIM 卡
AT+CPIN? +CPIN: READY OK- 返回
+CPIN: READY→ SIM 卡识别成功 - 返回
+CME ERROR: 10(SIM not inserted)→ SIM 卡没插好 / SIM 卡座焊接问题 / SIM 卡本身坏 - 返回
+CME ERROR: 11(SIM PIN required)→ SIM 卡有 PIN 码,需用AT+CPIN=1234输入 PIN
第三步:查信号
AT+CSQ +CSQ: 22, 0 OKCSQ 值含义:
| CSQ | 信号强度 | 说明 |
|---|---|---|
| 0-9 | 极差 | 几乎无法通信 |
| 10-14 | 差 | 容易掉线 |
| 15-19 | 一般 | 基本可用 |
| 20-25 | 良好 | 正常使用 |
| 26-31 | 优秀 | 信号强 |
| 99 | 未知 | 模组没检测到 |
CSQ < 10 时先检查天线。用弹簧天线比 PCB 天线好。
第四步:注网
AT+CGREG? +CGREG: 0, 1 OK第二个参数含义:
| 值 | 状态 |
|---|---|
| 0 | 未注册 |
| 1 | 已注册(本地网) |
| 5 | 已注册(漫游) |
| 2 | 搜索中 |
| 3 | 拒绝 |
如果一直返回 0 或 2(未注册/搜索中):
- SIM 卡是否已激活套餐
- 检查频段是否被锁定到错误频段
- 重启模组:
AT+CFUN=1,1
第五步:查运营商
AT+COPS? +COPS: 0, 0, "CHINA MOBILE" OK显示当前运营商。如果需要手动选网:
AT+COPS=1,0,"CHINA MOBILE"三、建立数据连接
3.1 中国移动 APN 配置
AT+QICSGP=1,1,"CMCC","","",1 OK参数:
- 1:context ID
- 1:IP 类型(1=IPv4)
- “CMCC”:APN 名称(移动用 CMCC 或 cmnet,联通用 3gnet,电信用 ctnet)
- “”,“”:用户名/密码(一般为空)
- 1:IP 版本(1=IPv4,2=IPv6,3=IPv4v6)
3.2 激活 PDP
AT+QIACT=1 OK AT+QIACT? +QIACT: 1, 1, 1, "10.123.45.67" OK第三个参数1表示已激活,第四个是分配的 IP 地址。如果激活失败:
- APN 配置错误
- 信号太差
- 套餐已用完/已停机
- 检查是否已注册网络(CGREG=1)
3.3 TCP 连接
// 打开TCP连接 AT+QIOPEN=1,0,"TCP","api.example.com",8080 OK +QIOPEN: 0, 0参数:
- 1:context ID(和 QIACT 的 ID 对应)
- 0:connect ID(0-11 可选,标识这条连接)
- “TCP”:协议
- “api.example.com”:服务器地址
- 8080:端口
第二个参数为0表示连接成功。非 0 是错误码。
3.4 发送数据
AT+QISEND=0,10 > hello world OK SEND OK发送 10 字节数据。模组返回>提示符后,输入数据(不会回显),Ctrl+Z(0x1A)结束发送。
3.5 接收数据
模组收到数据时主动上报:
+QIURC: "recv", 0, 50 // 收到50字节数据主动读取:
AT+QIRD=0, 100 +QIRD: 50 // 数据内容 OK3.6 MQTT 连接(EC200 内置 MQTT)
// 配置MQTT参数 AT+QMTCFG="version",0,4 AT+QMTCFG="keepalive",0,60 AT+QMTCFG="timeout",0,30,5 // 建立MQTT连接 AT+QMTOPEN=0,"broker.example.com",1883 OK +QMTOPEN: 0, 0 // 0表示连接成功 // 登录 AT+QMTCONN=0,"client_id","username","password" OK +QMTCONN: 0, 0, 0 // 0,0表示连接成功并已登录 // 订阅 AT+QMTSUB=0,1,"sensor/temp",1 OK +QMTSUB: 0, 1, 0 // 订阅成功 // 发布 AT+QMTPUB=0,0,1,0,"sensor/data" > hello OK SEND OK +QMTPUB: 0, 0, 0 // QoS1的ACK3.7 HTTPS 请求
AT+QSSLCFG="sslversion",2,4 // TLS1.2 AT+QSSLCFG="ciphersuite",2,"0x00FF" AT+QHTTPURL=32,80 // 输入URL: https://api.example.com/data OK AT+QHTTPPOST=50,80,80 > 输入POST数据 OK +QHTTPPOST: 0, 200, "OK" // HTTP 200响应四、超时参数一览
| AT指令 | 默认超时 | 建议值 | 说明 |
|---|---|---|---|
| AT+CGREG | 60s | - | 等待注网 |
| AT+QIACT | 150s | - | 激活PDP |
| AT+QIOPEN | 75s | 60s | TCP连接 |
| AT+QISEND | 5s | 10s | 发送数据 |
| AT+QMTOPEN | 60s | - | MQTT连接 |
| AT+QMTCONN | 60s | - | MQTT登录 |
五、常见错误码
| 错误码 | 含义 | 解决方案 |
|---|---|---|
| +CME ERROR: 10 | SIM卡未插入 | 检查SIM卡座 |
| +CME ERROR: 13 | SIM卡注册失败 | SIM卡是否欠费 |
| +CME ERROR: 100 | ISD无响应 | SIM卡坏 |
| +CME ERROR: 3 | 未注网 | 先注网再建连接 |
| +CME ERROR: 53 | DNS解析失败 | 检查域名是否正确 |
| +CME ERROR: 54 | 连接超时 | 检查服务器和端口 |
六、STM32 驱动代码
// AT指令发送和等待响应intsend_at_cmd(UART_HandleTypeDef*uart,constchar*cmd,char*response,intresp_size,uint32_ttimeout_ms){memset(response,0,resp_size);// 发送命令HAL_UART_Transmit(uart,(uint8_t*)cmd,strlen(cmd),100);HAL_UART_Transmit(uart,(uint8_t*)"\r\n",2,100);// 等待响应uint32_tstart=HAL_GetTick();intidx=0;uint8_tch;while(HAL_GetTick()-start<timeout_ms){if(HAL_UART_Receive(uart,&ch,1,10)==HAL_OK){if(idx<resp_size-1){response[idx++]=ch;}// 检查是否收到OK或ERRORif(strstr(response,"OK")||strstr(response,"ERROR")||strstr(response,"+CME ERROR")){break;}}}response[idx]=0;if(strstr(response,"OK"))return0;if(strstr(response,"ERROR"))return-1;return-2;// 超时}// 完整联网流程intec200_connect_network(UART_HandleTypeDef*uart){charresp[512];// 1. 检查通信if(send_at_cmd(uart,"AT",resp,sizeof(resp),1000)!=0){printf("AT failed\n");return-1;}// 2. 检查SIM卡if(send_at_cmd(uart,"AT+CPIN?",resp,sizeof(resp),5000)!=0){printf("SIM not ready\n");return-2;}// 3. 检查信号send_at_cmd(uart,"AT+CSQ",resp,sizeof(resp),1000);intcsq=parse_csq(resp);if(csq<10){printf("Signal too weak: CSQ=%d\n",csq);return-3;}// 4. 等待注网intretries=0;while(retries++<30){send_at_cmd(uart,"AT+CGREG?",resp,sizeof(resp),1000);if(strstr(resp,"+CGREG: 0, 1")||strstr(resp,"+CGREG: 0, 5")){break;}HAL_Delay(2000);}if(retries>=30){printf("Network registration failed\n");return-4;}// 5. 配置APNsend_at_cmd(uart,"AT+QICSGP=1,1,\"CMCC\",\"\",\"\",1",resp,sizeof(resp),10000);// 6. 激活PDPsend_at_cmd(uart,"AT+QIACT=1",resp,sizeof(resp),30000);// 7. 查IPsend_at_cmd(uart,"AT+QIACT?",resp,sizeof(resp),5000);printf("IP: %s\n",resp);return0;}七、踩坑清单
- 模组关机不是 AT 指令能控制的:PWRKEY 需要物理拉低 2 秒。MCU 用 GPIO 控制 PWRKEY
- 重启后 AT 端口波特率变化:部分固件重启后波特率恢复默认 9600。配置后存到非易失存储:
AT+IPR=115200;&W - 大缓冲区接收:TCP 单次接收可能几 KB。STM32 UART 接收缓冲区设 4KB 以上,配合 DMA
- UDP 和 TCP 切换:一条 connect ID 只能用一种协议。
AT+QICLOSE=0关连接后再切 - 固定波特率 vs 自适应:自适应波特率可能导致首次 AT 指令超时。开机后先发
AT+IPR=115200固定波特率
一句话总结:4G 模组调试的顺序——硬件通 → SIM 卡 → 信号 → 注网 → APN → 连接。每一步用 AT 指令确认通过再做下一步。跳步是调试的大敌。