猫池AT指令实战手册:从串口调试到中文短信PDU编码
2026/9/7 4:34:02 网站建设 项目流程

简介:这份PDF是一份面向物联网开发、短信平台集成及通信调试人员的猫池AT指令速查手册,聚焦短信猫池与GSM Modem通信中的常用控制命令,帮助读者快速解决拨号、短信收发、信号查询、串口配置等实际问题。资源为单个PDF文件,压缩包约14KB,内容以命令分类与语法说明为主,适合随身查阅和按需检索。目前已有226人学习下载。文档从AT指令的基本用法讲起,梳理了测试、读取、执行三类命令形式,并汇总ATE0、AT+CSQ、AT+CMGS、AT+CMGF、AT+CNMI等高频指令的含义与参数;同时专门讲解PDU模式发送短信、中文字符转Unicode编码、与GSM Modem建立串口通信的注意事项,以及+CMS ERROR各类错误的定位思路,能够为初学者避开常见坑点,也为有经验的开发人员提供一份简洁的排错参考。 做短信这块的人,基本都绕不开猫池。尤其是做验证码通知、物流提醒、企业内部告警这类业务,一买就是八口、十六口的池子,插上卡,接上服务器,靠的就是一串串AT指令在驱动。天天跟这些东西打交道,我就把日常用得最频繁的AT指令整理成了一份可查的手册,这次以博文方式分享出来,顺便把一些只会在实战里踩到的坑也一并讲了,希望帮你少走弯路。

1. 看懂猫池:一个串口阵列背后的AT指令世界

1.1 猫池到底是个什么设备

猫池,本质上是把多个GSM模块集成到一个机箱里,配上对应的SIM卡槽和串口控制板。从软件角度看,它就是一个多串口的Modem池——每个通道都对应一个独立的GSM模块,能插一张SIM卡,能单独收发短信、接打电话、走GPRS数据。

我第一次接触猫池时的直观感受是:它跟早年间的电话语音卡有点像,只不过语音卡走的是PSTN线路,猫池走的是移动网络信号。你通过串口给每一个通道发指令,模块就会执行对应的动作:查询信号、读SIM卡状态、发短信、读短信、删短信。整个过程中,AT指令就是你和模块之间唯一的对话语言。

1.2 为什么所有控制都依赖AT指令

AT指令的历史可以追溯到上世纪80年代Hayes公司定义的调制解调器命令集,后来GSM Module厂家把它继承了下来,几乎所有的2G/3G/4G模块都保留了对AT指令的支持。它的工作方式非常简单直接:你通过串口向模块发送一行以"AT"开头的文本,模块解析后执行操作,然后返回响应。

从协议栈角度看,AT指令位于应用层,它屏蔽了底层GSM协议栈的复杂度。你不需要关心SMS是怎么封装进信令里的,也不需要理解无线资源控制层的状态机,只需要告诉模块"把这个内容发给这个号码",模块就替你搞定了剩下的一切。这种设计让业务集成变得极其轻量,但同时也意味着:一旦指令用错或者参数配得不合适,排查链路会非常长。所以,花点时间把AT指令理解透,非常值得。

2. 开工前的关键准备:串口参数、供电与调试工具

2.1 串口连接与设备识别

猫池和电脑之间一般通过USB连接,驱动装好后,系统里会出现多个COM口。以八口猫池为例,通常会出现COM3到COM10这样的连续编号,每个COM口对应一个SIM卡槽位。拿到设备的第一件事,就是逐个打开这些串口,发送AT指令确认哪个COM口对应哪个通道,并把对应关系记录下来,省得后面收发短信时对不上号。

硬件连接有几个容易忽略的细节。猫池的供电非常关键,尤其是多通道同时收发短信的时候,瞬间电流会拉得很高。如果用的是USB供电,很容易出现供电不足导致模块随机掉线或者发送失败,所以有条件的话尽量用原厂电源适配器供电。另外,串口线质量也有影响,劣质USB转串口芯片在长时间高负载下会出现丢字节、乱码的问题,调试阶段可能不明显,批量跑起来就原形毕露了。

2.2 串口参数配置

GSM模块的串口默认参数一般是:波特率9600(部分模块是115200)、8位数据位、无校验、1位停止位。接到猫池上时,先用这些默认参数去连,如果返回乱码,再尝试其他常见波特率。模块本身支持通过AT+IPR指令修改波特率,我建议在项目部署时统一设置为115200,因为短信量大时,9600波特率下PDU数据包传输会有明显的延迟。

调试工具方面,我平时用SecureCRT比较多,设置好串口参数后直接回车就能看到模块返回的OK。Linux环境下用minicom或者screen也行。有一点需要提醒:不要同时开多个工具抢占同一个串口,不然会互相干扰,表现出各种奇怪问题。真要模拟程序自动收发的话,可以用Python的pyserial库写脚本,把常用的指令封装成函数,效率会高很多。

2.3 上电与模块启动时序

猫池上电后,模块需要几秒钟完成网络搜索和SIM卡初始化,高速率执行AT指令时,最好养成先等待几秒再发指令的习惯。我自己习惯在上电后循环发送AT指令,直到模块连续返回OK,再开始业务操作。这个"握手"过程虽然简单,但能过滤掉很多启动阶段的假故障。

3. 核心指令实测清单:状态查询、SIM卡识别与短信收发

3.1 状态与识别指令

底层的状态查询是整个调试过程的基础,模块是不是活着、卡有没有被识别、信号好不好,都要靠它们。我把最常用的列在下面:

指令作用典型返回备注
AT测试模块是否在线OK最基础的握手指令
AT+CGMI查询模块厂商HUAWEI确认固件来源
AT+CGMM查询模块型号ME909s-821确认硬件版本
AT+CGSN查询IMEI号15位数字设备身份标识
AT+CSQ查询信号质量+CSQ: 18,0第一个数越大越好,10以下要留意
AT+CREG?查询网络注册状态+CREG: 0,1第二个参数1或5表示已注册
AT+CPIN?查询SIM卡状态+CPIN: READY返回READY才能继续操作

信号质量这个指标,+CSQ返回的第一个数值范围是0到31,对应估算的接收信号强度,一般大于10才算基本可用,如果长期低于5,发短信的失败率会明显升高。第二个数值是误码率,通常为0。

3.2 SIM卡与运营商相关指令

AT+CIMI可以读取SIM卡的IMSI号,这个号码在物联网管理平台绑定设备时会用到。AT+CNUM可以查询本机号码,但很多卡不返回或者返回空,原因在于SIM卡中没有写入本机号码,这是很正常的现象,不要因此误判为模块故障。

AT+COPS?查询当前注册的运营商网络,返回内容包含运营商名称和接入技术。这个指令在排查漫游、选网问题时非常有用。如果发现模块注册到了不期望的网络上,可以用AT+COPS=0让模块自动选网,或者用AT+COPS=1,2,"46000"强制选择某个PLMN。

3.3 短信收发核心指令

短信息收发是猫池最常见的业务场景,按工作模式分为Text模式和PDU模式。Text模式简单但只适合纯英文或纯数字,中文必须用PDU模式,这一点后面单独讲。先看Text模式下的指令:

  • AT+CMGF=1:切换到Text模式
  • AT+CMGS="13800138000":发送短信,输入内容后按Ctrl+Z
  • AT+CMGR=1:读取SIM卡第1条短信
  • AT+CMGL="ALL":列出所有短信
  • AT+CMGL="REC UNREAD":列出未读短信
  • AT+CMGD=1:删除第1条短信
  • AT+CMGD=1,3:删除第1条及后续所有短信
  • AT+CNMI=2,1,0,0,0:设置新短信上报

这里重点说下AT+CNMI,很多人在做短信接收时发现模块不主动上报新短信,其实是因为没有开启上报功能。AT+CNMI=2,1,0,0,0的含义是:新短信到达后,模块主动通过串口输出+CMTI: "SM",1这样的提示,告诉你短信存到了第几条。程序收到这个提示后,再用AT+CMGR去读取内容。这套流程做短信网关时是标配。

3.4 辅助排错指令

AT+CMEE=2是我强烈建议一上来就执行的指令,它能让模块返回详细的数字错误码,而不是一个干巴巴的ERROR。比如ERROR: 330表示短信中心错误,ERROR: 512表示SIM卡未就绪。有了具体错误码,排查效率能翻几倍。另外,AT+CLIP=1开启来电显示,AT+CSMS=1开启增强短信支持,在部分模块上能提升短信发送的成功率。

4. PDU模式实战:中文短信编码全过程拆解

4.1 为什么必须用PDU模式

Text模式下,模块使用GSM 7bit默认字符集,只能发送英文、数字和有限的标点符号。中文不在这个字符集里,一旦发送中文内容就会出现乱码或者直接被拒绝。解决方法是切换到PDU模式,用UCS2编码(也就是UTF-16的变体)传输中文。PDU模式把短信内容以十六进制字符串的形式发送,理论上可以发送任意字符集中的内容,兼容性最好。

4.2 一条完整的中文短信PDU结构

以发送"测试"到13800138000为例,做一次完整的编码拆解。

第一步,把目标号码13800138000转成PDU格式。手机号码前加上中国的国际区号86,得到8613800138000,一共13位,是奇数位,需要在末尾补上F凑成偶数:8613800138000F。然后按两位一组反转顺序,得到68 31 08 10 83 00 F0。这里91表示号码格式是国际格式。

第二步,组装TPDU。协议头用1100表示这是一个SMS-SUBMIT消息,00是消息引用号,0D表示目标号码长度为13,接着是刚才算好的号码字节,00是协议标识符,08表示使用UCS2编码,04表示用户数据长度为4个字节,"测试"两个汉字各占2字节,最后是内容本身的UCS2编码6D4B 8BD5

第三步,拼接完整PDU串。短信中心字段用00表示使用SIM卡默认短信中心,完整PDU串为:

0011000D91683108108300F00008046D4B8BD5

发送时的AT+CMGS参数是TPDU部分的字节数,不包含短信中心字段的00。计算一下:11000D91683108108300F00008046D4B8BD5一共是19个字节,所以发送指令为:

AT+CMGS=19

模块返回>提示符后,粘贴PDU串,再发送十六进制的0x1A(即Ctrl+Z)结束输入。如果一切正常,模块会返回+CMGS: <编号>OK

4.3 PDU模式下的发送注意事项

一是格式必须严格:所有十六进制字符都要大写还是小写,不同模块要求不一样,我在部分模块上遇到过只认大写的情况,所以建议统一用大写。

二是超时问题:从输入AT+CMGS=19到模块返回提示符,再到发送完整PDU串,整个过程必须在模块的超时窗口内完成。如果输入速度太慢,模块会直接返回ERROR。程序实现时,发送完长度指令后,要等待收到>再发送内容,不要盲目sleep固定时长。

三是7bit和8bit编码的应用场景:纯英文短信用7bit编码可以塞进160个字符,PDU模式下对应编码方案为00;8bit编码主要用于二进制内容,对应编码方案为04;UCS2对应08,最多可发送70个汉字。做短信业务时要根据内容类型选择合适的编码方案,否则会白白浪费短信长度。

4.4 批量发送时的调度策略

猫池的优势在于多个通道可以并行发送。实际项目中,我通常会在每个通道上建立一个发送队列,串行处理队列里的短信,同时多个通道之间并行调度。这样做既能提高整体吞吐量,又能避免单个模块瞬间负载过高导致死机。

每发送一条短信,必须等待模块返回+CMGS: xx+OK才能继续下一条。有些模块在高负载下会出现假死,表现为长时间不返回任何内容。这种情况下,只要连续发送几条AT都没反应,就需要对模块做软复位或断电重启。企业级短信网关通常会做看门狗机制,定时检测模块心跳,一旦失联就自动重启对应通道,这个思路可以借鉴。

5. 踩过的坑:从无响应到发送失败的系统性排查

5.1 发送AT无响应或乱码

这是新手最常见的问题。排查链路我建议按这个顺序走:

  1. 检查驱动是否安装成功:设备管理器里能看到对应的COM口
  2. 检查串口号是否被其他程序占用:关掉所有调试工具,只保留一个
  3. 检查波特率是否正确:9600不行就试115200,或者反过来
  4. 检查模块是否完成启动:上电后多等几秒,多发送几次AT
  5. 检查USB线是否只供电不传数据:有些劣质USB线内部只有电源线,没有数据线

乱码问题基本可以锁定在波特率不匹配或串口工具设置错误上。数据位、校验位、停止位配置不对时,收到的返回内容就是一堆乱码。

5.2 信号正常但短信发不出去

+CSQ显示信号很好,+CREG也返回已注册,但AT+CMGS就是报错。这种时候先开AT+CMEE=2看具体错误码:

  • ERROR: 330:短信中心地址错误,检查SIM卡是否存了正确的短信中心号码。用AT+CSCA?查询,用AT+CSCA="+8613800xxx500"修改
  • ERROR: 512:SIM卡未就绪或已锁定,重新插拔SIM卡,检查卡是否损坏
  • ERROR: 515:内存已满,用AT+CMGD=1,3清空SIM卡存储
  • ERROR: 532:设备或SIM卡因发送太频繁被限制,这种情况需要降低发送频率,或者联系运营商处理

如果是大批量发送时出现部分失败,还要考虑是不是触发了运营商的频率限制规则。不同运营商的限制策略不一样,有的按号码维度限流,有的按SIM卡维度限流。稳妥的做法是控制每个通道的发送速率,比如每分钟不超过20条,同时在业务层面做好重试和补偿机制。

5.3 中文短信乱码

出现乱码的原因主要是编码模式错乱。比如发送时用了UCS2编码(PDU的08),但内容的十六进制计算错了;或者在Text模式下直接发送中文,模块不认。还有一种情况是PDU串里用户数据长度写错,少写或多写一个字节,都会导致接收方解析异常。

排查方法是先在电脑上用工具生成标准PDU串发送,确认模块本身没问题,再用自己写的程序逐步对照字节,通常很快就能定位问题。另外,不同模块对UCS2编码的大小端处理可能存在差异,虽然大多数模块遵循标准的UCS2大端顺序,但碰到乱码时可以尝试交换字节顺序看看。

5.4 新短信不主动上报

做了短信接收功能,却发现模块收到短信后没有任何反应。大概率是AT+CNMI参数没设置好,或者设置好后模块重启导致参数丢失。解决方法是每次模块上电初始化时,都通过程序重新设置一遍AT+CNMI=2,1,0,0,0。同时注意,如果SIM卡里已经存满了旧短信,新短信可能无法正常存储,也就不会产生上报事件,所以接收型项目要定期清理SIM卡存储空间。

5.5 多通道串口长时间运行后失联

猫池长时间运行后,某个或某几个通道突然无响应,这种问题多半出在软硬件资源上。我用过的设备里,最常见的原因是USB HUB的供电或驱动不稳定。Linux服务器上可以通过lsusb和内核日志查看设备状态,Windows服务器上则需要定时重启或者重新插拔设备。

程序层面,我会做一个定时器,每隔一段时间对所有通道发送AT心跳指令,连续三次无响应就判定通道失联,然后通过配套的GPIO控制模块断电重启。对于没有硬件断电能力的设备,只能依赖操作系统层的端口重置,或者让运维人员定期人工介入。这是猫池方案本身的一个固有短板,做高可用设计时需要提前考虑到。

5.6 SIM卡资源的隐藏坑

最后再说一个容易被忽略的问题:SIM卡的寿命和稳定性。猫池里的卡长期插在设备上高负荷运转,很容易因为过热、频繁读写而出现卡死。这类问题在信号、指令都正常的情况下随机发生,很隐蔽。所以批量项目里要定期巡检SIM卡状态,可以通过AT+CPIN?AT+CMGL="ALL"判断卡是否正常响应。一旦发现某张卡频繁触发异常,果断更换,不要心疼成本。

另外,不同运营商的SIM卡对AT指令的兼容性也有细微差别,比如某些卡的短信中心号码没有预置、某些卡默认关闭了点对点短信功能。新批次SIM卡到位后,先抽几十张做一轮全量指令测试,能避免很多上线后才暴露的问题。

做猫池项目这几年,我最大的感受就是:AT指令本身并不难,难的是理解模块在各种边界情况下的反应机制。把这套排查链路沉淀下来,把应急处理方案提前写进程序里,猫池用起来才真正算得上稳定。希望这份经验对你有所帮助。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询