简介:这份资源是移远通信官方发布的EC200x、EC600x、EG912Y系列LTE标准模块AT命令手册,面向使用上述模块进行产品开发的嵌入式工程师与物联网开发者,用于解决模块配置、网络连接与功能控制中的命令查询问题。压缩包内为1个PDF文件,约1.12MB,即完整的193页受控版技术文档,按命令逐条组织,便于按需检索。手册系统阐述了各AT命令的语法、参数、响应及使用场景,涵盖AT+CGATT查询GPRS附着状态、AT+CMGF切换短信模式等基础命令,以及拨号上网、收发短信、数据传输等复杂操作,并附有前言、使用与披露限制、版权商标、第三方权利、隐私声明及免责声明等章节,帮助读者在合规前提下正确调用模块功能。目前已有480人学习,适合需要权威命令参考与设计规范依据的开发人员常备查阅。
1. 拿到一份 193 页的 AT 手册,先别急着翻目录
手上有一块 EC200x 或 EC600x 的板子,串口助手打开,敲个AT回车,回OK,再敲AT+CSQ,回+CSQ: 20,99——到这一步很多人就卡住了:信号值 20 到底算好还是差?下一步该发哪条命令才能把数据发出去?网上搜到的命令和手册对不上,版本号又不知道从哪查。这份《EC200x&EC600x&EG912Y 系列 AT 命令手册》就是解决这类问题的:它把 LTE Standard 模块系列从通用命令、串口控制、状态控制、(U)SIM 卡、网络服务到呼叫、短信、数据业务的 AT 命令按章节拆开,每条命令给出语法、参数、响应和示例。适合正在做 4G 模组联网、短信收发、PPP 拨号、低功耗唤醒的嵌入式工程师,也适合刚接手模组调试、需要一份能对着抄命令的新手。手册是受控文档,版本 1.0,日期 2021-12-13,命令集覆盖 EC200x、EC600x、EG912Y 三个系列,同一份文档能覆盖多块板子,这是它最实用的地方。
2. 先建立命令分层:通用、串口、状态、网络各管一段
拿到手册不要从第一页顺序读,AT 命令是有层次的:底层是串口和回显配置,中层是模块状态与网络注册,上层才是业务(短信、拨号、数据)。层次搞反了,就会出现「命令发了没反应」的玄学问题。这一章先把分层逻辑和几个必调命令讲透,后面所有操作都建立在这上面。
2.1 通用命令是握手层,先确认「你是谁、什么版本」
通用命令(第 2 章)解决的是身份识别和会话配置。上电第一件事不是急着联网,而是确认模块型号、固件版本、IMEI,这三样决定了后面命令能不能用、参数范围是多少。手册里ATI、AT+GMM、AT+GMR、AT+CGSN分别对应 ID 信息、型号、固件版本、IMEI,其中AT+GMR返回的版本号要和手册版本对得上,否则某些扩展命令(比如AT+QCFG的子参数)可能不存在。
# 串口打开后逐条发送,每条等 OK 再发下一条 AT # 握手,确认串口通、波特率对 ATI # 返回厂商与型号,例如 Quectel EC200T AT+GMR # 固件版本,记下来,后面查命令兼容性用 AT+CGSN # IMEI,设备唯一标识,入网和售后都要 AT+CPIN? # SIM 卡状态,返回 READY 才能继续这几条命令的逻辑是「先通、再认、后查卡」。AT只验证物理链路,ATI/AT+GMR验证固件与手册匹配,AT+CPIN?验证 SIM 卡已就绪。参数上没什么可调的,但要注意AT+CPIN?返回+CME ERROR: 10表示没插卡,+CME ERROR: 11表示 PIN 需要解锁,这两种情况继续发网络命令全是白费。常见做法是把这个握手序列写进上电初始化脚本,任何一步失败就重试三次再报错,比人工盯着串口助手靠谱。
会话配置里最容易被忽略的是回显和结果码格式。ATE0关回显,ATV1用文本结果码,AT+CMEE=1让错误返回数字码而不是笼统的ERROR。这三条建议在初始化时固定下来,否则脚本解析响应时会因为多了一行回显而错位。AT+CMEE=2返回详细文本错误,调试阶段用 2,量产固件里用 1,省解析开销。
2.2 串口控制命令决定「能不能稳定通信」
第 3 章的串口控制命令看着简单,实际是翻车重灾区。AT+IPR设固定波特率,AT+IFC设流控,AT&C/AT&D设 DCD/DTR 信号模式。很多板子默认波特率是自适应,第一次连上能通,重启后波特率漂了,脚本就挂——血泪经验是初始化时显式发一次AT+IPR=115200并AT&W存进用户配置,别依赖自适应。
AT+IPR=115200 # 固定波特率,避免自适应漂移 AT+IFC=2,2 # 启用硬件流控 RTS/CTS,双向 AT&C1 # DCD 跟随载波状态 AT&D1 # DTR 变化时进入命令模式而非断连 AT&W # 存入用户配置文件,掉电不丢AT+IFC=2,2的两个参数分别是 TE 侧和 TA 侧的流控方式,2 表示 RTS/CTS 硬件流控。数据量大、波特率高于 115200 时不开流控,丢字节是必然的,表现为「AT 返回残缺」或「URC 被截断」。AT&C1让 DCD 真实反映连接状态,做 PPP 拨号时靠它判断链路是否建立。AT&D1的选择要看你的主控逻辑:如果 DTR 用来复位模块会话,选 1;如果 DTR 悬空不用,选 0 更稳。存配置用AT&W,恢复出厂用AT&F,从用户配置还原用ATZ,这三个命令的区别要分清,ATZ只还原不擦除,AT&F才是彻底重置。
2.3 状态控制与 QCFG:把模块行为调成你要的样子
第 4 章的AT+QCFG是移远扩展命令的核心,一个命令带十几个子参数,控制网络搜索模式、频段、URC 上报行为、USB 网卡模式、NAT 等。新手最容易在这里迷路,因为子参数名是字符串,拼错一个字母就返回ERROR且不告诉你哪错了。
AT+QCFG="nwscanmode",0,1 # 自动搜网,0=自动 1=GSM+LTF 优先 AT+QCFG="band",0,80,1 # 设频段,具体位图查手册 4.3.6 AT+QCFG="urc/cache",1 # 打开 URC 缓存,防止休眠时丢上报 AT+QCFG="usbnet",1 # USB 网卡模式,1=ECM 2=MBIM 3=RNDIS AT+QCFG="nat",1 # 网卡工作模式,1=启用 NATnwscanmode的第二个参数是搜网顺序,做海外项目时经常要锁 LTE 优先,避免在 2G 上耗时间。band的位图参数必须对着手册 4.3.6 的表格算,填错频段会导致「注册上了但没数据」,这个坑后面避坑章细说。urc/cache在低功耗场景必开,模块休眠时 URC 先缓存,唤醒后补发,不开就会丢短信或掉网通知。usbnet和nat是 USB 上网场景的组合拳,ECM 模式配 NAT 能让主控像插网卡一样上网,不用跑 PPP。
AT+QINDCFG控制 URC 上报开关,和QCFG里的urc/*子参数配合用。做低功耗产品时,把不需要的 URC(比如RI来电振铃)关掉,能减少唤醒次数,这是省电的关键细节,手册里分散在两处,得对着看。
3. 网络注册到数据业务:一条能跑通的命令链
身份和串口都通了,接下来是真正让模块上网。这一章按「查卡 → 注册 → 附着 → 拿 IP → 发数据」的顺序给一条完整命令链,每一步说清看什么响应、失败怎么判。手册第 5、6 章是命令来源,但顺序和判据得自己串。
3.1 SIM 卡与网络注册:先看 CSQ,再看 CREG
SIM 卡相关命令(第 5 章)里,AT+CPIN?查就绪,AT+QCCID查 ICCID,AT+CIMI查 IMSI,AT+QINISTAT查初始化状态。网络服务命令(第 6 章)里,AT+CSQ查信号,AT+CREG?查 CS 域注册,AT+COPS?查当前运营商,AT+QNWINFO查网络制式与频段。
AT+CPIN? # +CPIN: READY 才算卡就绪 AT+QCCID # +QCCID: 8986... 确认卡被识别 AT+CSQ # +CSQ: 20,99 第一个值是信号,第二个是误码率 AT+CREG? # +CREG: 0,1 第二个值 1=本地注册 5=漫游 AT+COPS? # +COPS: 0,0,"CHN-XX" 确认运营商 AT+QNWINFO # +QNWINFO: "LTE","...",... 确认制式和频段AT+CSQ的第一个值范围 0~31,99 表示未知。20 以上算可用,10 以下做数据业务会频繁重传,别急着怀疑模块,先查天线和频段。AT+CREG?的第二个值:0 未注册、1 本地、2 搜网中、3 拒绝、5 漫游。返回 3 通常是卡欠费或频段不匹配,返回 2 持续超过 30 秒要查AT+QCFG="band"是否锁错了频段。AT+QNWINFO能直接告诉你当前在 LTE 还是 GSM,做多模产品时这条比CREG更直观。
3.2 PDP 附着与拿 IP:CGATT、CGACT 的顺序不能反
数据业务的前提是 PDP 上下文激活。手册里AT+CGATT设 GPRS 附着,AT+CGACT激活 PDP,AT+CGPADDR查分配的 IP。顺序是先附着再激活,反了会返回+CME ERROR。
AT+CGATT=1 # 附着 GPRS,返回 OK AT+CGATT? # +CGATT: 1 确认已附着 AT+CGDCONT=1,"IP","cmnet" # 设 APN,1 是 cid,cmnet 按运营商改 AT+CGACT=1,1 # 激活 cid=1 的 PDP AT+CGPADDR=1 # +CGPADDR: 1,"10.x.x.x" 拿到 IPAT+CGDCONT的 APN 必须按运营商填,填错的表现是CGACT返回ERROR或一直拿不到 IP。AT+CGACT=1,1两个参数分别是状态和 cid,第一个 1 是激活,0 是去激活。拿到 IP 后做 TCP/UDP 可以用内置协议栈命令(手册后续章节的AT+QIOPEN一类),也可以走 PPP 拨号交给主控协议栈,选哪条路取决于主控资源和实时性要求:主控跑 Linux 走 PPP 更灵活,MCU 资源紧张用内置协议栈省事。
提示:
AT+CGATT=1返回 OK 不代表附着成功,一定要用AT+CGATT?查回 1,这是新手最常见的误判。
3.3 用 QCELL 和 QNWINFO 做现场排障
现场信号差、频繁掉网时,AT+QCELL能拿到服务小区和邻区信息,包括频点、PCI、RSRP。手册 6.10 节给了返回格式,配合AT+QNWINFO能判断是「信号弱」还是「小区拥塞」。
AT+QCELL # 返回服务小区与邻区列表,看 RSRP 和 PCI AT+QNWINFO # 确认当前频段,和 QCELL 的频点对得上RSRP 低于 -110 dBm 基本没法做数据业务,-90 以上算良好。邻区列表里如果同频邻区很多但服务小区 RSRP 差,说明位置在小区边缘,换天线或加外置天线比调参数有效。这套排查思路比反复重启模块有用得多,现场排障时我一般先跑这两条再决定动不动硬件。
4. 避坑与排查:五个真实翻车现场
手册是受控文档,写的是「命令应该怎么用」,但现场翻车往往出在「命令之外」。这一章按现象、原因、解决三段式记五个高频坑,都是调试 EC200x/EC600x 时反复遇到的。
4.1 现象:AT 有回 OK,但所有查询命令都超时
原因通常是回显和结果码格式没统一,脚本按\r\n切响应,模块回显把命令本身也回了一遍,解析错位。另一个可能是流控没开,高波特率下字节丢失。
解决:初始化固定ATE0、ATV1、AT+CMEE=1,波特率高于 115200 时开AT+IFC=2,2。脚本解析前先丢弃回显行,只认+XXX:开头和OK/ERROR结尾。
4.2 现象:CREG 显示已注册,但 CGACT 一直拿不到 IP
原因多半是 APN 填错或频段锁错。APN 大小写、cmnet/cmwap混用都会导致 PDP 激活失败;AT+QCFG="band"位图算错,注册在了一个不支持数据业务的频段上。
解决:先用AT+COPS?确认运营商,再按运营商填AT+CGDCONT;AT+QCFG="band",0先恢复全频段,确认能上网后再逐步锁频段定位问题。锁频段是优化手段,不是排障第一步。
4.3 现象:休眠唤醒后短信或掉网通知丢失
原因是 URC 在休眠期间没有缓存,模块醒了但事件已经过去。手册 4.3.9 的urc/cache就是干这个的,默认可能是关的。
解决:AT+QCFG="urc/cache",1打开缓存,配合AT+QINDCFG只保留必要的 URC,减少无效唤醒。唤醒后主动查一次AT+CREG?和AT+CGATT?,别完全依赖补发的 URC。
4.4 现象:USB 插上电脑识别成串口,不是网卡
原因是AT+QCFG="usbnet"没设或设成了 0(仅串口)。不同主控对 ECM/MBIM/RNDIS 支持不一样,设错模式电脑侧驱动装不上。
解决:Linux 主控优先usbnet=1(ECM),Windows 环境用usbnet=3(RNDIS),设完要重新枚举 USB(拔插或复位)。配合AT+QCFG="nat",1让模块做 NAT,主控侧不用再配路由。
4.5 现象:QCFG 子参数返回 ERROR,但拼写看着没错
原因是子参数名对大小写和斜杠敏感,比如urc/ri/other写成urc/RI/other就失败;另外部分子参数有固件版本门槛,老固件不认新参数。
解决:对着手册 4.3 节逐字符核对,尤其是斜杠和引号;用AT+GMR确认固件版本,版本低于手册要求时要么升级固件,要么换等效命令。调试时先发AT+QCFG=?看模块支持哪些子参数,比盲试快。
5. 把手册变成可复用的初始化脚本与验证清单
手册翻完容易忘,真正落地是把命令固化成脚本和清单。我一般做两件事:一份上电初始化脚本,一份联网自检清单。初始化脚本按「串口 → 身份 → 卡 → 网络 → 数据」五段写,每段带超时和重试;自检清单是现场排障时按顺序跑的几条命令,避免漏查。
import serial, time def send(ser, cmd, expect="OK", timeout=3): ser.write((cmd + "\r\n").encode()) deadline = time.time() + timeout buf = "" while time.time() < deadline: buf += ser.read(ser.in_waiting or 1).decode(errors="ignore") if expect in buf: return True, buf if "ERROR" in buf: return False, buf return False, buf ser = serial.Serial("/dev/ttyUSB2", 115200, timeout=1) init_seq = [ ("AT", "OK"), # 握手 ("ATE0", "OK"), # 关回显 ("AT+CMEE=1", "OK"), # 数字错误码 ("AT+IPR=115200", "OK"), # 固定波特率 ("AT+CPIN?", "READY"), # 卡就绪 ("AT+CGATT=1", "OK"), # 附着 ("AT+CGDCONT=1,\"IP\",\"cmnet\"", "OK"), ("AT+CGACT=1,1", "OK"), # 激活 PDP ] for cmd, exp in init_seq: ok, resp = send(ser, cmd, exp) if not ok: print(f"FAIL {cmd}: {resp}") break这段脚本的关键在send函数的判据:既认OK也认ERROR,超时返回失败而不是死等。init_seq的顺序就是前面讲的层次,任何一步失败就中断,避免在错误状态下继续发命令。参数上timeout=3对CGACT可能偏短,现场可以调到 10 秒;/dev/ttyUSB2是 AT 口,不同主控枚举出的口不一样,用ls /dev/ttyUSB*确认。
验证清单我固定跑这几条,按顺序看响应:
| 步骤 | 命令 | 期望响应 | 失败含义 |
|---|---|---|---|
| 1 | AT | OK | 串口/波特率错 |
| 2 | AT+GMR | 版本号 | 固件与手册不匹配 |
| 3 | AT+CPIN? | READY | 卡未就绪 |
| 4 | AT+CSQ | 首值 >10 | 信号弱 |
| 5 | AT+CREG? | 第二值 1 或 5 | 未注册 |
| 6 | AT+CGATT? | 1 | 未附着 |
| 7 | AT+CGPADDR=1 | 有 IP | PDP 未激活 |
这张表的价值在于把「凭感觉」变成「按序判」。现场遇到掉网,从第 1 步往下跑,哪一步断就定位到哪一层,比反复重启模块省时间。手册里命令分散在六章,这张表把它们串成一条线,是我调试这类模块时必带的后悔药。
从那以后我每次接手新板子,都强制先跑一遍这张清单再动业务代码,因为八成的问题在清单前四步就暴露了,根本轮不到上层逻辑。希望帮到你。
本文还有配套的精品资源,点击获取