展讯SPRD平台AT指令调试实战:从基础查询到私有扩展指令
干了这么多年嵌入式开发和基带调试展讯SPRD平台我前后摸过不少从功能机到4G Cat.1模块再到智能机方案都碰过。要说这平台最实用的调试手段AT指令绝对排第一。很多人觉得AT指令就是看看信号、发发短信实际上展讯平台的AT指令体系远不止这些它既是产线校准的入口也是底层问题定位的抓手还是功能机时代MMI应用和协议栈之间的唯一桥梁。这篇东西我想把展讯平台AT指令从基础查询到高级配置完整梳理一遍包括指令格式、常用指令、展讯私有扩展指令、调试环境搭建、常见坑位排查等等。写的时候会结合我实际调过的项目举例该给配置给配置该给代码给代码尽量让刚入行的工程师能照着手册抄作业也让做了几年的老手能查漏补缺。1. 展讯平台AT指令体系概览1.1 为什么展讯平台如此依赖AT指令AT指令的全称是Attention Command历史可以追溯到上世纪80年代Hayes调制解调器时代。当时的思路很简单用一个统一文本协议去控制设备主机通过串口发送AT命令字符串设备执行后回传结果。这个协议后来被3GPP标准化收进了TS 27.007和V.25ter规范成为移动通信设备最基础的对外控制接口。展讯平台对AT指令的依赖程度比很多人想象得要高。功能机时代展讯的MMI应用层根本没有Android的RILRadio Interface Layer那一套所有通话、短信、电话本、网络状态显示都是通过AT指令和协议栈交互的。到了4G模块和智能机方案虽然有了Android RIL但RIL本身下发到Modem的通道本质上还是AT指令只是外面包了一层。所以不管是做功能机软件、物联网模块、还是安卓主板定制只要用的是展讯芯片AT指令就是必修课。展讯在实现AT指令时操作系统通常是一个RTOSAT解析任务一般叫AT task从串口或者IPC通道接收字符流解析完命令之后调用协议栈对应模块的接口。这也解释了为什么展讯AT指令有非常明确的一问一答特性串口上任何一条命令最终都会有一个OK或者ERROR结尾。理解这一点对写自动化测试脚本很重要后面会讲到。1.2 指令格式与返回码看懂基带在说什么展讯AT指令遵循标准格式基本可以分成四类这个分类在所有AT指令文档里都通用无参数指令比如ATI查询模块信息、ATCGSN查IMEI直接执行返回结果。带参数指令比如ATCMGF1把短信模式切到文本模式参数通过等号赋值。查询指令命令末尾加问号比如ATCSQ?查询信号强度ATCGMR?查固件版本。测试指令末尾加?比如ATCMGF?返回当前固件支持的参数范围。命令统一以回车符CR也就是\r结尾展讯固件一般也接受换行符\n但建议严格按标准来。发送后模块会返回文本结果常见的包括OK、ERROR、CME ERROR: 。展讯的私有指令如果参数错误有时候返回的是SPRD ERROR或者直接不回复这个各家固件差异比较大遇到别慌换个固件对比一下就知道是硬件问题还是固件限制。还有一个要提醒的点URCUnsolicited Result Code主动上报结果。比如信号强度变化、来电话、短信到达这类事件模块不会等你发指令而是主动在串口上吐一行数据。像是CIEV: 5,2、RING、CMTI: SM,1这类。调试时如果串口突然冒出一行看不懂的数据别以为是乱码先看看是不是URC。为了减少干扰调试阶段可以发ATCNMI0把主动上报关掉。1.3 展讯扩展指令的分类逻辑展讯的AT指令大体分三层。第一层是标准协议指令比如ATD、ATH、ATCSQ、ATCGDCONT这些基本各平台通用。第二层是展讯芯片的私有PDPhysical Device相关指令主要是为适配展讯自己的协议栈和底层硬件这类指令通常以ATSP开头比如ATSPRF、ATSPNV、ATSPLOG。第三层是具体模组厂家基于展讯方案二次封装的指令比如某些Cat.1模组厂自己定义的TCP/IP透传指令严格说已经不属于展讯原生指令了。命名上SPRD私有指令习惯用ATSP加上功能缩写。比如射频相关是SPRFRF参数存储是SPNVNon-Volatile Memory的缩写日志是SPLOG。不过展讯不同芯片平台的私有指令并不完全统一SC6531系列、8910系列、UMS9117这些平台的指令命名和参数个数都有差异。所以我建议拿到任何一块展讯模组或板子第一件事就是用ATCLAC指令把当前固件支持的指令列表导出来再对着固件版本号找对应的Release Notes比直接翻一个老的指令文档靠谱得多。2. 基础查询指令组把模块状态摸清楚2.1 设备身份与固件版本不管是新模块点样还是售后故障机排查第一步永远是确认模块身份。ATI是最基础的识别指令它会返回模块厂商、型号和版本号不同固件的返回行数不完全一样但前三行基本都有用。ATCGMR直接查固件版本ATCGSN查IMEI。IMEI在产测和入网测试里极其关键很多生产问题最后发现是IMEI写重复或者校验位错了所以每次拿到新模块我都会第一时间记录IMEI。在Linux下用串口工具发指令我习惯用picocom命令很简单picocom -b 115200 /dev/ttyUSB0进入之后敲ATI回车返回类似Spreadtrum Communications Inc. SC6531E R11.18.00 OK注意实际返回内容取决于具体平台和固件这里只是示意。如果连ATI都返回ERROR先确认是不是工程固件有些量产固件会禁用识别类指令的完整返回这种情况往往是需求方为了安全考虑要求屏蔽的。固件版本号对排查问题帮助很大。展讯固件版本一般带编译日期或构建编号遇到同一个问题在两个版本上表现不一致十有八九是固件变更导致的。我一般会把每一批次的固件版本、对应AT指令行为差异记录在案后面排查问题能省很多时间。2.2 网络、SIM卡与信号质量网络侧查询是日常用得最多的。ATCSQ?返回两个值第一个是RSSI信号强度范围0到3199表示不可测第二个是BER误码率0到799表示不可测。RSSI到dBm的换算大致是dBm -113 2 * RSSI也就是说RSSI 10大约-93dBmRSSI 20大约-73dBmRSSI 30大约-53dBm。这个换算关系可以快速判断模块当前信号环境。网络注册状态用ATCREG?查询电路域注册ATCGREG?查GPRS分组域注册4G平台还要看ATCEREG?查EPS注册状态。返回值的第二个参数表示注册状态0是未注册1是已注册本地网2是正在搜索3是注册被拒绝5是注册漫游。实际调试中如果CSQ信号很好但是CREG一直是0或3一般先怀疑SIM卡没插好、PIN码锁定或者运营商白名单配置问题。查询SIM卡状态用ATCPIN?SIM卡就绪返回OK并带READY未就绪会返回CME ERROR: 10或者13之类。ATCCID返回SIM卡的唯一识别号ATCOPS?能看当前注册的运营商ATCOPS?则扫描周围所有可用网络这个指令比较耗时有时候要等几十秒测试时要有耐心。展讯4G平台还会支持ATCOPS0选择自动注册一般不用手动指定运营商。2.3 电池、充电与功耗辅助查询电池电量查询指令是ATCBC返回格式一般是ATCBC: , , 。充电状态0表示未充电1表示充电中2表示充电完成。电量百分比和电压在不同固件里顺序可能略有差异所以不要只看一个字段就下结论。这块在实际项目里很有用。我在做功能机功耗测试的时候经常用脚本定时读ATCBC记录电池电压曲线判断待机电流是否异常。正常情况下电压曲线应该是一条缓慢下降的直线如果出现突然掉压说明电流有异常尖峰再配合功耗仪进一步分析。另外产线测试里展讯平台也会通过AT指令采集电池电压来判断是不是低电分选漏检这块逻辑各工厂有自己的实现但是读取电压的基础指令基本都是这一条。展讯平台还有一个跟电池相关的扩展指令用来校准电量计或者读取ADC值具体指令名在不同平台不一样。这里就不写死了总之遇到电量不准、充电曲线异常优先找展讯FAE要电池校准的AT指令文档别自己在量产固件里胡试。3. 通话、短信与数据业务配置3.1 通话控制指令的正确姿势通话控制是AT指令里最容易出问题的地方。拨号指令是ATD注意语音呼叫一定要在号码后面加分号。ATD10086;表示语音呼叫ATD10086不带分号则被当作数据呼叫处理这在有些固件上会直接报ERROR有些固件则会尝试走CSD数据连接。接听是ATA挂断是ATHATCHUP也能挂断当前通话。实际操作中出现过一个经典问题ATD指令返回OK之后我以为电话已经拨出去了实际上OK只表示指令被接受真正建立呼叫要等对端摘机。模块在呼叫过程中会返回振铃URC比如对方响铃但未接听时返回RING已接通后返回CONNECT或者NO CARRIER表示通话结束。展讯平台在语音通话中默认会打开音频通道但如果你用的是开发板没有配置音频通路对方可能听不到声音这种情况需要查私有指令切换音频通道通常涉及ATSPEQLEVEL或者音频路由相关扩展指令具体以固件文档为准。通话过程中发送DTMF按键音标准指令是ATVTS数字比如ATVTS1。这个在IVR语音菜单测试中很常用。挂断后一定要等NO CARRIER结果码出现再发下一条指令否则可能出现指令排队异常。3.2 短信收发PDU模式才是王道短信指令看起来简单实际上坑不少。ATCMGF1切到文本模式后发短信命令是ATCMGS手机号回车后出现提示符输入内容再发CTRLZ0x1A确认发送发0x1B取消。读取短信用ATCMGLALL列出全部短信。文本模式最大问题就是中文。虽然文本模式理论上用GSM 7-bit或者UCS2编码可以处理但展讯部分固件在文本模式下对中文支持不稳定经常出现发出去变成乱码的问题。我的建议是凡是涉及中文短信一律用PDU模式。PDU模式下短信内容编码成十六进制字符串一条完整的发送PDU包含SMSC信息、TPDU头、号码编码和用户数据。举个例子给号码13800138000发送内容test半字节反转后的号码是3108810030F8内容test用GSM 7-bit编码后是54E57A73最终发送的指令是ATCMGS17 0011000D916831081030F80000A70454E57A73CMSG后面的17是PDU字节数注意这个值要写对写错会直接ERROR。实际工程项目里很少有人手编PDU基本都是代码里拼。下面这个Python函数可以用来生成短信PDU配合pyserial发送我在测试脚本里一直在用def encode_sms_pdu(number, message): # 将号码转为半字节反转格式 number number.replace(, ) if len(number) % 2: number F number_encoded .join(number[i1] number[i] for i in range(0, len(number), 2)) # UCS2编码中文内容 message_encoded message.encode(utf-16-be).hex().upper() # 组装PDU这里使用简单的TP-MTI1 pdu 0011000D91 number_encoded 0008 message_encoded length (len(pdu) - 2) // 2 # 去掉SMSC长度字段后的字节数 return length, pdu想真正在生产环境跑短信功能千万不能用\r当作结束符PDU模式下必须发送0x1A并且等待模块的CMGS: 返回表示发送成功并分配了短信序号。很多新手在这卡住以为CTRLZ发出去了就行其实没等结果码就发下一条指令很容易把短信搞丢。3.3 数据业务与APN配置的常见坑数据业务的AT指令标准化程度比较高。ATCGDCONT1,IP,cmnet配置PDP上下文ATCGACT1,1激活PDPATCGATT?查询GPRS附着状态ATCGPADDR1查询模块获取到的IP地址。我踩过最典型的坑是APN配置顺序问题。有些展讯平台的固件要求先配置ATCGDCONT再执行ATCGACT1,1激活顺序反了会返回ERROR或者激活后拿不到IP。另外如果模块同时配置了多个PDP上下文比如一个默认数据通道加一个专网APN在激活时要确保context id与上层路由对应否则数据可能走到错误的网络。还有一个容易被忽略的问题APN参数里的用户名密码。如果APN需要认证需要用ATCGAUTH1,1,user,password设置认证类型认证类型1是PAP2是CHAP具体看运营商要求不要想当然地全填。实际项目遇到能注册网络但上不了网的问题排查思路是先看ATCGATT?是不是1再看ATCGPADDR有没有拿到IP再看PING外网一层一层排除不要一上来就怀疑是模块坏了。4. 展讯私有扩展指令与高级配置4.1 私有指令的特点与获取方式展讯私有指令绝大多数以ATSP开头跟标准指令最大的区别在于它们直接操作底层硬件和协议栈私有接口。举个不太精确但容易理解的类比标准AT指令是前台服务员SP指令是拿着仓库钥匙的后勤主管。前台能做到的事情有限后勤主管可以直接改仓库里的东西改对了效率极高改错了麻烦也大。私有指令通常不在公开的通用AT手册里而是单独放在一份叫AT Command Extension或者SPRD Private AT Command的文档里需要跟展讯原厂或代理商签NDA获取。具体指令在不同平台差异很大比如SC6531功能机平台的扩展指令和8910 Cat.1模块平台的就不完全一样。开发时最好的做法是找FAE要对应芯片平台和固件版本的私有指令手册再结合ATCLAC实际验证一遍我遇到过文档写的有指令但固件里被裁掉的情况。量产固件一般会禁用部分私有指令毕竟产测指令如果开放给用户很容易被乱改参数导致不可用。这不算展讯的问题所有芯片平台都这么做。如果你的调试对象是量产固件发私有指令返回ERROR先不要怀疑指令错了很可能就是固件裁剪了功能。4.2 射频、校准与生产测试展讯平台在产线上做射频校准比如APC功率校准、AFC频率校准、AGC增益校准自动测试设备一般通过ATE工具和产测软件交互而不是在普通串口上手工敲AT命令。但产测软件和Modem之间通常还是通过一组私有AT指令来触发和读写校准参数类似ATSPRF或者ATSPRFCAL这类。手工调试时这类指令最常用的场景是检查射频前端的配置。比如想看看当前模块工作在哪个频段、哪个功率等级可以用类似ATSPRF?的方式查询返回类似 , , 这样的信息。不过不同平台字段含义不同不能一概而论。如果你想做的只是生产测试方案还是得让展讯FAE给出当前平台的产测指令规范并且务必在工程固件或EVB板上验证千万别直接拿用户量产固件试。另外一个常见需求是恢复出厂校准。有时候硬件维修换了功放或者天线匹配器件直接读出来的校准参数已经失效需要重新校准。如果产线工具不在手上展讯部分的工厂维修工具也能通过AT入口触发完整校准序列但是这个过程需要模组进入特定测试模式时间也比较长手工操作前务必确认模块散热和供电稳定。4.3 NV项读写底层参数的注册表NV项Non-Volatile Memory items是展讯平台存储非易失参数的地方功能上类似电脑的注册表。IMEI、MAC地址、射频校准值、默认APN、串口波特率、音频参数、各种使能开关都存在NV项里。展讯在调试阶段提供类似ATSPNV读写的扩展指令格式一般是ATSPNV , 来读取ATSPNV , , 来写入。这条指令是把双刃剑。用得好可以不改固件就调整平台的默认配置比如在产线上批量写入IMEI用不好直接把模块写废最常见的就是NV里的射频校准区域被覆盖模块信号变差、无法注册网络甚至反复重启。写NV前如果没备份基本只能重新校准或者返厂维修。我给几条非常实际的建议第一操作NV前用展讯的NV工具或者固件升级工具做一次完整备份第二只修改自己确定含义的NV项不了解用途的项绝对不要写第三写完一个NV项后等待模块保存完成一般需要几百毫秒别马上断电更别连续写几十个项然后立刻重启第四量产固件请确认私有NV指令已经被禁用或加密防止误操作。很多变砖的模组最后查出来都是NV区域被写坏了这个责任可不好背。4.4 日志输出与Modem调试展讯平台的日志系统比很多人想象的复杂。Modem协议栈日志、物理层日志、系统异常dump这些正常情况下通过专用的日志USB口或者ADB配套工具抓取手机端用展讯的LOG工具可以在PC上实时解析AT指令交互、网络事件、协议栈状态。某些调试场景下需要把Modem日志重定向到串口输出这时候可能用到ATSPLOG或者类似的私有指令来切换日志通道。用AT指令开日志有个问题日志量一大串口带宽就成了瓶颈尤其是物理层日志每秒钟可能产生几百KB数据115200bps的串口完全扛不住。所以我的经验是用AT指令开日志只适合抓小范围、低速率的问题比如开机后注册网络、SIM卡初始化这类短时流程。真正的大流量日志还是用USB抓取然后离线分析。如果你的板子代码是自己编译的也可以在展讯的SDK配置里直接打开日志输出让Modem的打印通过调试串口出来这比AT指令更强大也更底层但需要编译期打开宏不能只靠运行期指令控制。做协议栈二开的兄弟应该对这些宏不陌生。4.5 工厂模式与产测指令展讯平台出厂前会有几十项功能测试包括屏幕、触摸屏、摄像头、喇叭、马达、闪光灯、按键、充电等等。产测软件跑这些测试时很多底层操作是通过私有AT指令或者工厂模式命令完成的比如ATSPCMD后面跟不同的子命令可以触发某个GPIO输出、点亮闪光灯、设置马达转动或者读取ADC采样值。这类指令在正常的应用固件里通常被裁剪只在工厂测试固件里完整开放。如果你需要制作售后检测工具光拿量产固件去发这些指令是行不通的正确的做法是向原厂申请工厂测试固件或者用官方售后工具配合工厂固件来执行。我自己以前做售后站软件时就吃过文档写有但量产固件没有的亏来回查了半天。这里也提醒一点生产测试指令涉及的动作大多会操作硬件外围比如强制给马达通电、点亮大电流闪光灯如果长时间持续触发轻则发热重则损坏器件。产测指令设计出来就是短时点测用的写自动化脚本时一定要控制好每次触发的时长和间隔。5. 实操调试环境搭建与脚本化验证5.1 串口连接、波特率与工具选择展讯平台的调试绝大部分场景是走串口。功能机开发板一般引出三根线TX、RX、GND模块是TTL电平要注意不能直接接RS232口否则可能烧IO最好通过USB转TTL模块连接板上通常有3.3V电源也可以一起引出。4G模块尤其是Cat.1模组一般直接用USB转串口或者标准USB口Linux下插上会识别成/dev/ttyUSB0、/dev/ttyUSB1甚至多个节点。展讯AT口波特率常见的是115200日志口可能是921600甚至更高所以插上开发板之后先确认你拿到的设备节点对应哪个口。我记得有个项目板子上同时有两个串口设备AT口是/dev/ttyUSB1Boot日志口是/dev/ttyUSB0我在ttyUSB0上敲了半天AT没反应差点以为模块坏了。Windows下调试我推荐MobaXterm或者SecureCRT串口参数设置主要是波特率115200、8数据位、无校验、1停止位、无流控。Linux下用picocom最方便sudo picocom -b 115200 /dev/ttyUSB0退出picocom是CtrlA然后CtrlX不熟悉的朋友经常直接拔线反而容易搞挂会话。设置日志回显可以用Tee或者picocom自带的logfile参数方便记录现场。5.2 手工调试会话实录下面是一段我自己调试展讯Cat.1模块时的真实操作序列用来演示一条条指令怎么敲。打开串口后输入AT回车确认串口通信正常AT OK接着查模块身份和信号ATCGMR R14.1.0 OK ATCSQ? CSQ: 18,0 OKRSSI 18对应的dBm大约-77dBm室内环境下这个信号算正常。继续查SIM卡和网络注册ATCPIN? CPIN: READY OK ATCGREG? CGREG: 0,1 OK返回值第二个参数是1表示GPRS已注册本地网。接下来配置APN并激活数据业务ATCGDCONT1,IP,cmnet OK ATCGACT1,1 OK ATCGPADDR1 CGPADDR: 1,10.32.14.55 OK拿到IP之后就可以尝试TCP连接。模块内置协议栈的话一般用模组私有指令展讯有些方案有自己的TCPAT指令有些模组厂家封装成ATCIPSTART之类我这里就不展开具体命令了因为不同模组封装的差异实在太大照着自家模组手册来最稳。5.3 用Python批量跑AT测试手工敲指令效率太低了遇到要测100次信号强度或者连续发50条短信的场景脚本是最好的选择。用Python的pyserial库写一个最简单的循环查询信号强度脚本import serial import time ser serial.Serial(/dev/ttyUSB0, 115200, timeout1) for i in range(10): ser.reset_input_buffer() ser.write(bATCSQ\r) time.sleep(0.2) response ser.read_all().decode(errorsignore) print(f{i1}: {response.strip()}) time.sleep(1) ser.close()这里有两个细节要提醒。第一发送之前用reset_input_buffer清空缓冲区避免把上一次的残留反馈混进来。第二发送完等待一段时间再读取虽然AT指令理论上回得很快但有些查询指令比如ATCOPS?可能要几十秒超时等待时间要根据指令类型设定不能统一用一个200毫秒的延时去套所有指令。更复杂的测试脚本建议引入状态机因为URC会插入到正常响应流里。比如测试短信接收的同时又在发ATCSQ串口数据里可能混入了CMTI: SM这行URC简单的read_all然后找特定关键字会误判。我的做法是收到数据后先判断是否以开头是则归入事件队列否则归入响应队列这样逻辑清晰很多。如果你要做产线级别的自动化测试可以单独跑一台Linux工控机用pyserial控制模块用数据库存测试结果配合扫码枪做序列号绑定。展讯产线软件是官方做好的但是很多二次开发的测试项目比如定制固件的功能验收用这种脚本方案反而更灵活。6. 常见问题排查与踩坑实录6.1 串口一个字节都不回这是最让人头大的问题。我的排查顺序是先看板子有没有供电模块有没有开机电流再用示波器或者万用表量TX引脚有没有电平切换确认模块是否在跑然后检查USB转串口有没有识别Linux下ls /dev/ttyUSB*Windows下看设备管理器有没有出现端口接着量一下TX/RX电压展讯串口通常在1.8V或3.3V如果量出来是0V或接近VCC很可能虚焊最后把TX和RX短接用串口助手自发自收确认串口工具本身没坏。还有一个经常被忽视的点模块开机后有一个Boot阶段会打印大量启动日志如果这时你的串口TX/RX接到了Boot日志口而不是AT口会一直看到乱码一样的系统日志敲AT不会有任何反应。这时候一方面确认AT口是不是独立口另一方面等完全开机后再试。6.2 返回乱码和数据错位之前遇到过一个项目模块返回的AT结果在SecureCRT里显示正常在MobaXterm里就是中文乱码——最后发现是终端编码不一致。AT指令本身的返回是纯ASCII本身不会乱码如果你是在脚本里解析数据时出现乱码多半是decode用了gbk而不是ascii/utf-8尤其PDU模式下的十六进制字符串都是ASCII别用UTF-8的严格解码去处理。串口硬件层面乱码最常见原因是波特率不对。AT口设置成115200结果终端开成了9600能收到数据但全部是乱码。其次是USB转串口芯片质量太差我踩过CH340在高温环境下丢字节的坑后来全都换成了FT232或者CP2102。还有地线问题模块和电脑之间必须共地否则数据线上参考电压不稳也会出现间歇性乱码。6.3 指令报ERROR但手册明明支持发一条指令返回ERROR不代表指令本身有问题先按下面的清单逐项排查排查项检查方法固件裁剪用ATCLAC列出实际可用指令看指令是否存在参数格式检查是否有引号、空格、逗号顺序、分号结尾参数范围用ATCMD?查询固件支持的范围模块状态确认是否在飞行模式、通话中、正在搜网工程固件私有指令是否只在工程固件下开放举个实际例子有次我发ATCMGS1发短信返回ERROR查了一圈发现是模块SIM卡没有就绪卡没插好导致短信功能直接被拒绝。这种问题看起来是指令错误实际上跟指令本身无关所以排查时先确认模块处于正常待机状态再考虑指令层面的问题。6.4 死机、重启和砖机风险控制AT指令本身99%的指令都不会造成死机但剩下的1%就够你喝一壶。最容易出事的三类操作一是写NV项写到了关键区域二是射频测试指令长时间触发让PA过热三是调试日志串口和业务串口抢占了同一资源。真遇到模块跑着跑着重启先看看供电电流。展讯平台在4G射频发射时电流峰值很高如果电源带载能力不足瞬间跌落会导致模块复位。我做过一个项目用USB口直接供电一拨电话就重启后来换独立稳压电源问题消失典型的供电不足。操作NV之前一定做好备份操作之后至少等2秒再执行其他操作。如果模块已经变砖连接升级工具的Download口重新烧录固件一般能救回来但如果连升级口都进不去可能就要动硬件了。这里只能强调预防真出了问题联系FAE是最快的路。我做展讯平台调试这几年最大的体会是AT指令本身不复杂复杂的是对平台行为的理解。标准指令随便哪家都一样私有指令才是区分平台能力的关键而私有指令的信息壁垒很高没有文档只能靠测靠猜。所以不管你是做模块选型还是做产线工具第一步一定记得把对应平台、对应固件版本的AT指令文档留档拿到板子先把ATCLAC跑一遍看看固件实际支持什么。调试过程中要是遇到指令行为跟手册不一致别急着怀疑自己先换一个固件版本对比一下很多时候是固件变更带来的差异。最后再分享一个小技巧在AT脚本里无论多简单的指令都不要省略结果码等待宁可多等100毫秒也不要为了赶时间连续发指令这是AT调试稳定性最关键的习惯之一。