如何将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参数是可选的。

<stat> 参数接受以下值:

  • "REC UNREAD": 收到的未读消息

  • "REC READ": 收到的已读消息

  • "STO UNSENT": 存储的未发送消息

  • "STO SENT": 存储的已发送消息

  • "ALL": 所有消息

**<mode>** 参数(可选)接受以下值:

  • 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); // Setting the baud rate of GSM Module
   Serial.begin(9600); // Setting the baud rate of Serial Monitor (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);
   // Print the response on the Serial Monitor
   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输出接收到的信息。

更新于:2021年7月24日

3K+ 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始
广告
© . All rights reserved.