# SIM900A 如何用 AT 命令获取短信发送号码？

> 原文链接：https://robotics.hellobike.com/pitfalls/2013-12-31-robotics-se-1743
> 频道：pitfalls | 更新日期：2013-12-31 | 标签：auto, stackexchange, arduino, microcontroller
> 核心摘要：SIM900A 收到短信后找不到发送方号码，可用 AT+CMGF? 确认模式，再用 AT+CMGL 列出短信并解析来源号码。

# SIM900A 如何用 AT 命令获取短信发送号码？

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[AT command in SIM900A GSM/GPRS module to find out originating address of an SMS](https://robotics.stackexchange.com/questions/1743/at-command-in-sim900a-gsm-gprs-module-to-find-out-originating-address-of-an-sms)（Robotics Stack Exchange #1743）

**状态**：已解决

## 问题

提问者使用 SIM900A 接收短信，`AT+CNMI` 只能提示有新短信，无法得到发送方号码；知道 `AT+CMGL=<stat>[,<mode>]` 可能包含 `oa` originating address，但不清楚返回格式。

## 环境

嵌入式控制器 / 串口通信

## 解决办法

1. 用 `AT+CMGF?` 查看短信模式：`0` 为 PDU mode，`1` 为 Text mode。
2. 如果是 Text mode，用 `AT+CMGL="ALL"` 列出所有短信；返回的 `+CMGL` 行中第三个字段如 `"+85291234567"` 就是短信来源号码。
3. 如果是 PDU mode，用 `AT+CMGL=4` 列出所有短信，再按 PDU 数据解析来源地址。
4. 可选 `MODE` 参数：`0` 为普通读取，`1` 为不改变指定短信记录状态。

原问题作者：shailendra；采纳答案作者：EDDY74。原内容依 CC BY-SA 4.0 授权，本页摘要同样依 CC BY-SA 4.0 授权。
:::

## 原始参考来源 (Sources)

- [Robotics Stack Exchange #1743：AT command in SIM900A GSM/GPRS module to find out originating address of an SMS](https://robotics.stackexchange.com/questions/1743/at-command-in-sim900a-gsm-gprs-module-to-find-out-originating-address-of-an-sms)