at模块收短信流程是嵌入式通信领域中一项基础且关键的功能,主要用于设备与SIM卡之间的短信交互,整个流程涉及硬件接口、AT指令集、协议解析等多个环节,需结合模块特性和系统需求进行合理设计,以下从准备工作、核心流程、异常处理及优化方向四个维度进行详细阐述。

收短信前的准备工作
在启动短信接收流程前,需确保硬件连接与模块配置就绪,硬件层面,AT模块需通过UART接口与主控MCU正确连接,确保TX/RX交叉、共地稳定,波特率、数据位、停止位等参数需与主控端匹配,软件层面,需完成以下初始化配置:
- 模块启动与注册:通过AT指令重启模块(AT+CFUN=1),等待网络注册成功(响应CREG: 1或5)。
- 短信模式设置:选择短信存储位置(AT+CPMS=”SM”)及文本模式(AT+CMGF=1),便于后续解析短信内容。
- 新短信提示开启:发送AT+CNMI=2,1,启用新短信到达时主动上报(+CMTI: “SM”, index),避免轮询延迟。
核心接收流程详解
短信接收流程可分为“主动上报式”和“轮询查询式”两种模式,前者效率更高,后者适用于需严格控制的场景。

(一)主动上报式流程
- 新短信到达:当模块收到新短信时,通过UART向主控发送+CMTI提示,格式为“+CMTI: “SM”, <短信索引>”,其中索引为短信在SIM卡中的存储位置。
- 读取短信内容:主控根据索引号发送AT+CMGR=<索引>指令,模块返回短信内容,包含发送方号码、时间戳及正文(示例:+CMGR: “REC UNREAD”,”+86138xxxx”,”23/05/01,15:30:30+08″,”Test SMS”)。
- 短信处理与删除:主控解析内容后,若需保存可调用AT+CMGS回复,若无需保留则发送AT+CMGD=<索引>删除短信,避免存储空间不足。
(二)轮询查询式流程
适用于未开启CNMI提示的场景,主控需定期(如每30秒)发送AT+CMGL=”ALL”列出所有短信,再根据未读标志(+CMGL: “REC UNREAD”)逐条处理。
常见异常处理机制
| 异常类型 | 处理方法 |
|---|---|
| 短信存储满 | 发送AT+CPMS查询剩余空间,若不足则执行AT+CMGD删除旧短信或提示用户更换SIM卡。 |
| 指令无响应 | 检查模块是否 busy(返回ERROR),可通过AT+CSQ信号质量排查网络问题。 |
| 中文乱码 | 确保AT+CMGF=1为文本模式,或使用HEX模式(AT+CMGF=0)解析PDU码。 |
| 短信拆分 | 长短信可能被拆分为多条,通过TPDU中的UDHI字段识别并合并处理。 |
流程优化建议
- 缓冲区管理:在主控端设置环形缓冲区,暂存+CMTI提示,避免因MCU处理不及时导致消息丢失。
- 协议兼容性:针对不同模块(如SIM800L、EC20)的AT指令差异,设计适配层统一接口。
- 低功耗设计:在无短信任务时,通过AT+CSCLK=2进入休眠模式,由新短信中断唤醒模块。
相关问答FAQs
Q1:如何区分短信是普通文本还是PDU格式?
A1:通过AT+CMGF指令设置模式:AT+CMGF=1为文本模式(直接显示内容),AT+CMGF=0为PDU模式(需手动解析十六进制编码),日常开发推荐使用文本模式简化流程。

Q2:短信接收超时如何排查?
A2:首先确认模块网络状态(AT+CREG?),若已注册则检查AT+CNMI是否正确开启;若仍超时,可通过AT+CMGS=<号码>手动发送测试短信验证模块收发功能,或用示波器监测UART信号是否稳定。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/70970.html