0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用STM32F103C8和SIM800C GSM模块发送/接收短信

科技观察员 来源:circuitdigest 作者:Pramoth Thangavel 2022-09-07 15:34 次阅读

GSM 模块经常用于物联网项目,因为它能够远程发送和接收数据。GSM 模块没有像 Wi-Fi 模块那样的依赖项。虽然其他无线模块如Wi-Fi或Zigbee具有短距离和成本等缺点,但 GSM 模块具有可靠性、长距离,因为有效计划只需要一张 SIM 卡。尽管 GSM 模块无法发送传感器生成的大量数据,但它非常适合需要发送少量合理数据的应用。

在本教程中,此类GSM 模块将与 STM32F103C8 ARM 微控制器连接,以从程序中配置的蜂窝移动号码发送和接收文本消息 (SMS)。为了显示接收和发送的消息,一个16x2 LCD将与两个按钮一起使用,这两个按钮将在按下相关按钮后启动文本消息的发送和接收。

所需组件

STM32F103C8 Cortex-M3微控制器

GSM模块(本教程使用SIM800C)

16x2 液晶显示器

按钮 (2)

10k 电位器

面包板

连接电线

什么是 SIM800C GSM 模块?

poYBAGMYSPuADWwrAAUzjCioXlc212.png

SIM800C 是一种广泛使用的 GSM 模块,带有串行接口调制解调器,可在 3.4V-4.4V 电压等级之间运行。SIM800C 是一款四频 GSM/GPRS 模块,用于需要远程数据传输的嵌入式应用。SIM800C 工作在 850/900/1800/1900MHz。它还可以低功耗接收和发送语音电话,短信。模块通过 AT 指令控制。它支持一个 SIM 卡接口,并具有 UART(TX 和 RX)引脚以及一个 RS232 串行协议,可用于与嵌入式应用中的不同微控制器接口。

为 SIM800C GSM 模块供电

SIM800C GSM 模块使用一个 12V 的 DC 电源适配器供电。

将 SIM 卡插入 SIM800C GSM 模块

SIM800C GSM 模块的背面插入了一张 SIM 卡。注意SIM800C不支持4G,所以不要插入4G SIM卡。

poYBAGMYSPeAYnmGAAVsFNIBRLo428.png

GSM SIM800C与STM32F103C8接口

为了将SIM800C 与 STM32F103C8 微控制器连接,将使用 UART 串​​行端口,它是 STM32F103C8 的硬件串行接口。下图表示 STM32F103C8 中的 UART 引脚,分别是 A9 和 A10。

pYYBAGMYSPOAWAVRAArWo3cOF0Y496.png

STM32F103C8 具有三个 UART 接口,用于连接三个外部串行外设。

AT 命令

AT 命令将用于访问 GSM 模块的功能,例如发送和接收语音呼叫、短信。下面给出了一些 AT 命令,它们在本教程中很重要,并且会经常使用。

poYBAGMYSO6ADVoiAAA78scxngs295.png

poYBAGMYSOqAAFZ2AAA6ZEW0zf0585.png

电路原理

GSM 与 STM32的连接如下图所示。

poYBAGMYSOaABK4oAASi5odR7ic410.png

STM32F103C8和GSM SIM800C之间的电路连接

pYYBAGMYSOOAND_DAAANwKaTBTE007.png

STM32F103C8 和 16x2 LCD 之间的电路连接

poYBAGMYSN6ALM2lAACL8_d5vSY349.png

两个带有 10k 下拉电阻的按钮连接到 STM32 微控制器的引脚 PA0 和 PA1。完整的设置如下所示:

poYBAGMYSNuARsXgAAav2Ftkj-0009.png

为 GSM 接口编程 STM32F103C8 微控制器

STM32F103C8 微控制器可以使用 ARDUINO IDE 进行编程。在本教程中,无需 FTDI 或 ST-LINK 编程器即可对 STM32 进行编程。要将代码上传到 STM32F103C8,只需将 microUSB 端口插入 STM32,然后使用 USB 电缆将 USB 端口插入 PC,然后开始在ARDUINO IDE中编写代码。如有任何疑问,请按照我们之前关于如何在不使用任何外部 FTDI 或 ST-LINK 编程器的情况下对 STM32 进行编程的教程进行操作。

完整的代码和工作视频可以在本教程的末尾找到。

首先包括本教程中使用的外围设备的必要库。还要定义 LCD 的引脚配置。

#include                             
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;      
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

接下来,选择函数lcd.begin(16,2) 初始化 LCD;其中(16,2)告诉 LCD 类型,例如 16x2 块 LCD 显示器。只需打印一条消息以调试 LCD 是否提供输出并正确连接。

lcd.开始(16,2);           
lcd.print("STM32 带 GSM");   
lcd.setCursor(0,1); 
lcd.print("SIM800C");

将 Push button 数据方向定义为 Input Mode 并定义使用的引脚号。

pinMode(PA0,输入);       
pinMode(PA1,输入);

选择用于串行通信的波特率。

Serial1.开始(9600);

代码中有两个函数,一个是发送消息,另一个是接收消息。下面给出详细解释。

信息

此功能用于向某个号码发送短信。AT命令被发送到GSM模块,指示消息文本模式以及需要发送消息的号码。

以下语句通过发送 AT 命令(AT+CMGF=1)将 GSM 模块设置为文本模式。

Serial1.println("AT+CMGF=1"); //将GSM模块设置为文本模式

之后,指示发送带有手机号码的 SMS 的 AT 指令(AT+CMGS)通过 serial1 端口发送到 GSM 模块。

Serial1.println("AT+CMGS="+91XXXXXXXXXX"\r"); // 将 x 替换为手机号码

消息每隔一秒使用 AT 命令发送,然后需要发送 CLRL+Z,因此 CTRL+Z 的 ASCII 码通过 Serial1 端口发送到 GSM 模块。

延迟(1000);
Serial1.println("来自 GSM 模块的 Hi 电路文摘"); // 要发送的短信
Serial1.println((char)26);// CTRL+Z 的 ASCII 码

然后在 16X2 LCD 显示屏上显示“SMS sent”。

lcd.print("短信发送");

接收消息

在此功能中,信息被接收并打印在 LCD 显示屏上。

Serial1.println("AT+CNMI=2,2,0,0,0");

因此,要接收实时消息,使用上述 AT 命令。

收到 SMS 后,它包含一个在 serial1 端口可用的字符串,其中还包含其他数据,例如时间、日期等。因此,在出现第六个双引号 (“) 后,剩下的就是收到的 SMS。因此,其他信息被省略,接收到的消息的剩余信息显示在16x2 LCD 显示屏上。

while(1) 
  { 
           if(Serial1.available()) 
            {
                做
                  { 
                     while ( !Serial1.available() );    
                  } while ( '"' != Serial1.read() );
               做
                  { 
                      while ( !Serial1.available() );     
                  } while ( '"' != Serial1.read() ); 
               做
                 {
                      而 ( !Serial1.available() );    
                  } while ( '"' != Serial1.read() );
               做
                 { 
                    while ( !Serial1.available() );    
                 } while ( '"' != Serial1.read() );
                做
                  { 
                     while ( !Serial1.available() );               
                  } while ( '"' != Serial1.read() ); 
                做
                 {
                    而 ( !Serial1.available() );  
                  } while ( '"' != Serial1.read() ); 
                  while ( !Serial1.available() );
                  接收 = Serial1.read();     
                  而 ( !Serial1.available() );
                  接收 = Serial1.read() ; 
    lcd.clear(); 
    while(1) 
    { 
        while (!Serial1.available());
        接收 = Serial1.read(); 
        if (receive == '\r')   
              中断;
     否则
             lcd.write(receive); 
     } 
} 
}

使用 STM32 发送和接收短信的演示

1. 要发送短信,只需按左按钮。短信将发送到代码中输入的手机号码。

pYYBAGMYSNKAcBStAAWicFS4Yl4031.png

2. 要接收短信,只需按右按钮,短信就会被接收并显示在液晶显示屏上。

pYYBAGMYSM6AbayvAAX8Nc4wPHs837.png

这就是将GSM 模块与 STM32F103C8 ARM微控制器连接起来的全部内容。
#include //LCD 显示库


const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //LCD和STM32之间连接的引脚


LiquidCrystal lcd(rs, en, d4, d5, d6, d7);


int接收= 0;


无效设置()


{



lcd.begin(16,2); //LCD 设置为 16x2 模式



pinMode(PA0,INPUT); //按钮作为输入引脚

pinMode(PA1,INPUT);



lcd.print("STM32 带 GSM"); //显示欢迎信息

lcd.setCursor(0,1);

lcd.print("SIM800C");



Serial1.开始(9600);// 设置GSM模块的波特率


延迟(1000);





lcd.clear();


}


无效循环()


{



lcd.clear();

lcd.setCursor(0,0);

lcd.print("S 发送短信");

lcd.setCursor(0,1);

lcd.print("R 接收短信");

延迟(100);





int a = digitalRead(PA0); //读取按钮的状态

int b = digitalRead(PA1);



if (a == 1) // 取决于按下哪个按钮,调用相应的函数

{

SendMessage();

}



else if( b == 1)

{

RecieveMessage();

}



}



void SendMessage() //发送消息的函数

{

lcd.clear();



lcd.print("发送短信");

延迟(1000);

Serial1.println("AT+CMGF=1"); //将GSM模块设置为文本模式


延迟(1000);


Serial1.println("AT+CMGS="+91XXXXXXXXXX"\r"); // 将 x 替换为手机号码


延迟(1000);


Serial1.println("来自 GSM 模块的 Hi 电路文摘"); // 您要发送的 SMS 文本


延迟(100);


Serial1.println((char)26);// CTRL+Z的ASCII码


延迟(1000);

lcd.clear();

lcd.print("短信发送");

延迟(1000);

}


void RecieveMessage() //接收消息的函数


{



lcd.clear();

lcd.print("接收短信");


Serial1.println("AT+CNMI=2,2,0,0,0"); // AT 命令接收实时短信


延迟(1000);



while(1)

{

if(Serial1.available())

{




{


而(!Serial1.available());


} while ( '"' != Serial1.read() );








{


而(!Serial1.available());


} while ( '"' != Serial1.read() );








{


而(!Serial1.available());


} while ( '"' != Serial1.read() );








{


而(!Serial1.available());


} while ( '"' != Serial1.read() );






{


而(!Serial1.available());




} while ( '"' != Serial1.read() );





{



而 ( !Serial1.available() );




} while ( '"' != Serial1.read() );



而(!Serial1.available());


接收 = Serial1.read();


而(!Serial1.available());


接收 = Serial1.read();




lcd.clear();


而(1)


{


而(!Serial1.available());


接收 = Serial1.read();


if (receive == '\r')



中断;



别的


lcd.write(接收);

}

}

}

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6806

    浏览量

    147600
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8648

    浏览量

    361746
  • GPS模块
    +关注

    关注

    0

    文章

    85

    浏览量

    16141
  • STM32F103C8
    +关注

    关注

    1

    文章

    23

    浏览量

    8011
收藏 人收藏

    评论

    相关推荐

    sim800c总是自动关机

    单片机控制sim800c上网模块,插上物联卡和GSM天线,激活开机后,5-8秒之后 sim800c就会关机。测试了电源的电压是3.74V,关
    发表于 09-26 16:15

    SIM800C的透传模式的问题

    我搞SIM800C,要进入透传模式发送接收数据。 现在有一些疑问: 先说发送模块返回CONNECT OK,就说明进入透传模式。 这时候还要
    发表于 10-24 18:14

    sim800c例程不能实现触摸效果

    );实现了拨号功能,用的是f1战舰,但是对于短信发送却没有办法实现,sim800c串口测试一切正常,求解答,多谢。
    发表于 04-11 22:50

    sim800c例程不能实现触摸效果

    );实现了拨号功能,用的是f1战舰,但是对于短信发送却没有办法实现,sim800c串口测试一切正常,求解答,多谢。
    发表于 04-23 06:36

    SIM800c怎么通过传感器控制模块发送短信

    我现在使用sim800c,我想通过传感器控制模块发送短信(我现在就用一个光电管实验)。我能正确读到传感器信号引脚的电平,把这个信号接到PA4,判断PA4的电平情况来控制
    发表于 04-24 00:15

    SIM800C模块接收短信时会卡死

    SIM800C模块接收短信时会卡死。发短信也没有回馈,但对方能收到。是模块出了问题了?
    发表于 04-28 09:56

    sim800c的TCP发包时好时坏

    我使用STM32F103 + SIM800c做的板子。sim800c连接到服务器之后,使用定时器,每60秒发一次心跳包。但测试后,有时候全部的心跳包都可以发送成功,有时候,又会间隔着有
    发表于 04-30 06:27

    请问有SIM800C固件代码吗?

    现在用的开发板是F407,现在想做远程监控,通过现场传感器感受到危险后通过短信告诉远方的主人,买了一个SIM800C模块,但是由于SIM800C
    发表于 05-08 23:15

    SIM800C模块怎么实现语音播报把信息内容播放出来

    目前我已实现了SIM800C发送短信功能,同时我又想让语音播报把信息内容播放出来,是否可以实现?能够将0.5W的小喇叭接到耳机接口?又是如何接线的。如果SIM800C
    发表于 05-20 04:38

    sim800c使用MQTT时数据长度有什么限制?

    sim800c 使用MQTT时,数据长度的限制问题?问题:最近在使用STM32F1+SIM800C实现MQTT的时候,遇到一个问题。就是在发送的数据长度达到一定的时候,服务器收不到数据。但使用其他
    发表于 05-22 04:36

    请问怎么用SIM800C实现远程短信报警功能?

    和电脑相连,打开串口调试软件,发送AT指令之后软件并无反应,用光盘里的两个调试软件,还有SIM800c卖家提供的资料的串口调试软件都不可以,AT指令无法发送,我不知道是我模块和电脑连接
    发表于 06-13 04:35

    SIM800C激活开机后自动关机

    单片机控制sim800c上网模块,插上物联卡和GSM天线,激活开机后,5-8秒之后 sim800c就会关机。测试了电源的电压是4V,关机的时
    发表于 08-30 20:08

    STM8单片机给SIM800C发送AT指令,请问SIM800C串口怎么连接?

    通过STM8单片机给SIM800C发送AT指令,SIM800C串口怎么连接
    发表于 10-22 00:16

    SIM800C使用STC89C52单片机读写短信的方法

    写英文短信短信是向单片机的SBUF寄存器一位位发送字符串,从而与SIM800C模块达到通信的目的void UartPrintf(unsig
    发表于 12-02 06:38

    使用SIM800L GSM/GPRS模块从Arduino发送短信/文本

    电子发烧友网站提供《使用SIM800L GSM/GPRS模块从Arduino发送短信/文本.zip》资料免费下载
    发表于 10-26 15:36 4次下载
    使用<b class='flag-5'>SIM800</b>L <b class='flag-5'>GSM</b>/GPRS<b class='flag-5'>模块</b>从Arduino<b class='flag-5'>发送</b><b class='flag-5'>短信</b>/文本