如何将 Arduino 与 GSM 模块连接并读取短信?
本文将介绍如何将 Arduino 与 GSM 模块连接,并读取发送到模块所连接 SIM 卡的短信。
您需要以下组件:
Arduino 开发板
GSM 模块(SIM800C、SIM900A 是常见的型号,但您也可以使用其他型号的模块)
GSM (2G) SIM 卡,或带有 2G 备用功能的 4G SIM 卡(Jio SIM 卡不适用于本项目)
GSM 天线
您也可以使用 GSM 模块开发板,例如下图所示的开发板(SIM 卡座位于……)。板子的另一面)−

GSM 模块通过 UART 与微控制器交互(参见上图左下角的 UART 跳线孔)。我们将使用 SoftwareSerial 连接到 GSM 模块。
电路图
电路图如下所示

如图所示,我们将GSM模块的RX连接到Arduino的5号引脚,TX连接到9号引脚,GND连接到GND。由于GSM模块将使用单独的1A以上适配器供电,因此无需将Vcc连接到Arduino(它需要的电流大于Arduino引脚所能提供的电流)。由于在 UART 连接中,一个模块的 TX 连接到另一个模块的 RX,反之亦然,因此 Arduino 的引脚 5 将用作 TX(因为它连接到 GSM 模块的 RX),引脚 9 将用作 RX。
GSM 模块使用 AT 指令工作。本文不赘述 AT 指令的细节。但是,您应该知道,每个 GSM 指令都有其对应的 AT 指令手册,所有操作(发送短信、拨打电话、连接互联网等)都应参考该手册。
SIM900 的 AT 指令手册可在此处找到。
读取接收到的短信需要使用两条 AT 指令(一条用于将模块模式设置为文本模式,另一条用于实际读取短信)。
AT+CMGF=1 这条命令将短信格式设置为文本模式。另一种模式是 PDU(协议数据单元)模式。我们只对文本消息感兴趣,所以将模式设置为文本模式。
第二个 AT 命令是 AT+CMGL,它不是短信读取命令,而是短信列表命令。我个人觉得它比短信读取命令更方便。
AT+CMGR 需要您指定要读取短信的内存位置,而 AT+CMGL 需要您提供要读取的短信类型(已存储、未读等)。然后它会获取所有符合该类型的短信,并将它们作为列表返回。
语法
它的语法是 −
AT+CMGL = <stat>[,<mode>]
如方括号所示,mode 参数是可选的。
"REC UNREAD": 已接收未读邮件
"REC READ": 已接收已读邮件
"STO UNSENT": 已存储未发送邮件
"STO SENT": 已存储已发送邮件
"ALL": 所有邮件
0:正常模式(默认)
1:不更改指定短信记录的状态(即,即使使用此命令获取了未读消息,该消息仍保持未读状态)
此命令的详细返回输出可在本GSM模块的AT命令手册命令手册第102-104页中找到。
下面提供了包含上述AT命令的Arduino代码。如果您使用的是Arduino Uno以外的开发板,则并非所有数字引脚都支持SoftwareSerial。请点击此处了解 SoftwareSerial 的限制。
#include <SoftwareSerial.h>
SoftwareSerial gsmSerial(9, 5); // RX, TX
void setup()
{
gsmSerial.begin(9600); // 设置GSM模块的波特率
Serial.begin(9600); // 设置串口监视器(Arduino)的波特率
delay(1000);
Serial.println("Preparing to read received SMSes");
}
void loop()
{
ReadUnreadMessages();
delay(1000);
}
void ReadUnreadMessages()
{
Serial.println("Setting the GSM in text mode");
gsmSerial.println("AT+CMGF=1\r");
delay(2000);
Serial.println("Fetching list of received unread SMSes!");
gsmSerial.println("AT+CMGL=\"REC UNREAD\"\r");
delay(2000);
// 在串口监视器上打印响应
while (gsmSerial.available() > 0) {
Serial.write(gsmSerial.read());
}
}
收到短信后,相关的串口监视器输出将类似于以下内容−
+CMGL: 1,"REC UNREAD","+911234567890",,"06/06/21,00:04:10+40" SMS List Demo. +CMGL: 2,"REC UNREAD","+911234567890",,"06/06/21,00:06:12+30" SMS List Demo Again.
请注意,除了短信正文之外,您还会收到发送短信的手机号码、短信时间戳以及短信内容。手机号码和时间戳之间的空白字段最好填写电话簿中与该号码关联的姓名或文本。
您可以编写一个简单的函数来解析从 CMGL 输出中收到的信息。

