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

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 模块?
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卡。
gsm sim800c与stm32f103c8接口
为了将sim800c 与 stm32f103c8 微控制器连接,将使用 uart 串​​行端口,它是 stm32f103c8 的硬件串行接口。下图表示 stm32f103c8 中的 uart 引脚,分别是 a9 和 a10。
stm32f103c8 具有三个 uart 接口,用于连接三个外部串行外设。
at 命令
at 命令将用于访问 gsm 模块的功能,例如发送和接收语音呼叫、短信。下面给出了一些 at 命令,它们在本教程中很重要,并且会经常使用。
电路原理图
gsm 与 stm32的连接如下图所示。
stm32f103c8和gsm sim800c之间的电路连接
stm32f103c8 和 16x2 lcd 之间的电路连接
两个带有 10k 下拉电阻的按钮连接到 stm32 微控制器的引脚 pa0 和 pa1。完整的设置如下所示:
为 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. 要发送短信,只需按左按钮。短信将发送到代码中输入的手机号码。
2. 要接收短信,只需按右按钮,短信就会被接收并显示在液晶显示屏上。
这就是将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(接收);
}
}
}
}

网件推出两款支持wifi6的Mesh分布式路由器,实现体验高速无线网络
太原理工大学在新能源汽车智能传感研究领域取得重要进展
MOS管如何判断IC的驱动能力?
跨时钟域信号如何处理 跨时钟域电路设计
组成与改进装饰用盆式火焰灯电路的方法
使用STM32F103C8和SIM800C GSM模块发送/接收短信
盘点假日出游必备的可穿戴“神器”
恩智浦喜获“卓越职场”殊荣!
提升电驱动系统的功率多合一整合方案
iphone8什么时候上市?iphone8最新消息:郭台铭都来了,这下iphone8真的开始量产了
工业无人机固定翼激光雷达 傲势纯电动无人机才是未来
阿里云最新研究报告《人工智能:未来制胜之道》介绍
基于TMS320C6455系列DSP的中断系统的使用
2020排名前15位的半导体供应商是哪些?
Molex新推单排镀金 Pico-Clasp线对板连接器
云创硬见PCB基础知识(一)
激光雷达的3D成像原理及应用分类
广东联通5G的新时代也将到来,新一代通信技术与现在的4G有什么区别?
硅光,大战打响
孩子们的可穿戴怎样避免出现隐患