目录
第一部分、前言
1、准备知识
前面第一篇【STM32训练—项目1】第一篇、电脑的串口助手驱动SIM900A发送中文和英文短信_大屁桃的博客-CSDN博客相关知识我已经做了准备,并且做了详细的介绍,如果你没看,你可以点击这个链接去了解如何让先利用电脑上的串口助手调试一下SIM900A发送中文和英文短信,这样有利于接下来你对我STM32代码的理解哈,我这里就不再BB。
这一篇我要详细作介绍的就是通过代码如何用STM32实现SIM900A发送中文和英文短信的发送,关于串口的相关知识和配置属于STM32的基本知识,所以我会带上【STM32学习—项目1】的小标题,这也迎合了我写STM32这个专栏的顺序,如果觉得我文章写的很乱的建议去看我这篇专栏的开篇之作:个人感悟,你就会明白我的用心良苦,方便他人,也方便自己。【STM32学习】个人感悟_大屁桃的博客-CSDN博客
2、调试目的
我调试这个模块,为了实现因为这个模块是我项目1中的一部分功能,到时候我会将我发的所有模块整合成一个整体的小项目,这个我也在这篇专栏的开篇之作:个人感悟中提到,有兴趣的可以去看。
3、模块和单片机的接线方式
1、单片机的电源接入相应的电源
单片机 PB10 | 对应于 |
SIM900A的管脚5VR |
单片机 PB11 | 对应于 |
SIM900A的管脚5VT |
单片机 GND | 对应于 |
模块 GND |
单片机 5V | 对应于 |
模块 VCC_MCU |
2、模块单独供电
模块的 VCC(或 VCC5V) | 对应于 |
外接DC5V |
模块的 GND | 对应于 |
外接电源GND |
第二部分、工程代码
1、代码功能描述(认真读)
单片机下载程序后现象如下:首先,LED0亮两秒后发送英文短信,发送成功后关闭,随后,LED1亮两秒后发送中文短信,发送成功后关闭
最后,都发送成功后LED0和LED1闪烁。同时串口会一直打印消息发送的响应结果。
2、SIM900A发送英文短信的代码
代码为什么这么写,你要把前一篇【STM32训练—项目1】第一篇、电脑的串口助手驱动SIM900A发送中文和英文短信_大屁桃的博客-CSDN博客看懂才能明白我为什么要这样利用串口发指令,我看了正点原子的SIM900A的例程代码,简直是麻烦他妈给麻烦开门,麻烦到家了。
/**************************************************************************/
//函数作用:发送英文短信函数
//函数名称:sim900a_send_English_message(char *message,char *phonenumber)(uint8_t number);
//内部参数:message phonenumber
//修改日期:2022年1月26日 凌晨2:40、
//作者: (CSDN搜)大屁桃
/**************************************************************************/
void sim900a_send_English_message(char *message,char *phonenumber)
{
Usart_SendString2(USART3,"AT\r\n"); //SIM900A是否与单片机来连接成功
delay_ms(200);
while(Find_char((char*)Usart3_buff,"OK"));
printf("English_message_OK1\r\n");
Usart_SendString2(USART3,"AT&F\r\n"); //SIM900A复位
delay_ms(200);
while(Find_char((char*)Usart3_buff,"OK")); //字符串匹对函数
printf("English_message_OK2\r\n");
Usart_SendString2(USART3,"AT+CSCS=\"GSM\"\r\n"); //英文短信指令1
delay_ms(200);
while(Find_char((char*)Usart3_buff,"OK"));
printf("English_message_OK3\r\n");
Usart_SendString2(USART3,"AT+CMGF=1\r\n"); //英文短信指令2
delay_ms(200);
while(Find_char((char*)Usart3_buff,"OK"));
printf("English_message_OK4\r\n");
sprintf(dispbuf,"AT+CMGS=\"%s\"\r\n",phonenumber);
Usart_SendString2(USART3,dispbuf); //英文短信指令3
delay_ms(200);
while(Find_char((char*)Usart3_buff,"OK"));
printf("English_message_OK5\r\n");
Usart_SendString2(USART3,message); //英文短信指令4
delay_ms(200);
while(Find_char((char*)Usart3_buff,"OK"));
printf("English_message_OK6\r\n");
Usart_SendHalfWord(USART3,0x1a); //结束指令
delay_ms(2000); //延时两秒
while(Find_char((char*)Usart3_buff,"OK"));
printf("English_message_OK7\r\n");
}
3、SIM900A发送中文短信的代码
发送中文和发送英文的区别就是电话号码和内容都要用Unicode编码实现,这个需要用到转换软件,前面一篇文章的末尾可以免费下载。其次比发英文的多了一行代码 Usart_SendString2(USART3,"AT+CSMP=17,167,0,8\r\n");
/**************************************************************************/
//函数作用:发送中文短信函数
//函数名称:sim900a_send_Chinese_message(char *message,char *phonenumber)(uint8_t number);
//内部参数:message phonenumber
//修改日期:2022年1月26日 凌晨2:40
//作者: (CSDN搜)大屁桃
/**************************************************************************/
void sim900a_send_Chinese_message(char *message,char *phonenumber)
{
Usart_SendString2(USART3,"AT\r\n"); //SIM900A是否与单片机来连接成功
delay_ms(200);
while(Find_char((char*)Usart3_buff,"OK")); //字符串匹对函数
printf("Chinese_message_OK1\r\n");
Usart_SendString2(USART3,"AT&F\r\n"); //SIM900A复位
delay_ms(200);
while(Find_char((char*)Usart3_buff,"OK"));
printf("Chinese_message_OK2\r\n");
Usart_SendString2(USART3,"AT+CSCS=\"UCS2\"\r\n"); //中文短信指令1
delay_ms(200);
while(Find_char((char*)Usart3_buff,"OK"));
printf("Chinese_message_OK3\r\n");
Usart_SendString2(USART3,"AT+CMGF=1\r\n"); //中文短信指令2
delay_ms(200);
while(Find_char((char*)Usart3_buff,"OK"));
printf("Chinese_message_OK4\r\n");
Usart_SendString2(USART3,"AT+CSMP=17,167,0,8\r\n"); //中文短信指令2
delay_ms(200);
while(Find_char((char*)Usart3_buff,"OK"));
printf("Chinese_message_OK5\r\n");
sprintf(dispbuf,"AT+CMGS=\"%s\"\r\n",phonenumber);
Usart_SendString2(USART3,dispbuf); //中文短信指令3
delay_ms(200);
while(Find_char((char*)Usart3_buff,"OK"));
printf("Chinese_message_OK6\r\n");
Usart_SendString2(USART3,message); //中文短信指令4
delay_ms(200);
while(Find_char((char*)Usart3_buff,"OK"));
printf("Chinese_message_OK7\r\n");
Usart_SendHalfWord(USART3,0x1a); //中文结束指令
delay_ms(2000); //延时两秒
while(Find_char((char*)Usart3_buff,"OK"));
printf("Chinese_message_OK8\r\n");
}
4、main.c文件代码
代码不做多介绍,我每条代码都有备注,很容易看懂。
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "sim900a.h" //SIM900A短信发送模块
//接线
/**************************************************
1、单片机的电源接入相应的电源
单片机 PB10 --- 模块 5VR
单片机 PB11 --- 模块 5VT
单片机 GND --- 模块 GND
单片机 5V --- 模块 VCC_MCU
2、模块单独供电
模块的 VCC(或 VCC5V)接入 DC5V
模块的 GND 接入电源地
*****************************************************/
/**************************************************************************/
//函数作用: 硬件初始化,初始化单片机功能以及外接设备
//函数名称: Hardware_Init();
//外部部参数: 无
//修改日期: 2022年1月27日 21:35
//作者: (CSDN搜)大屁桃
/**************************************************************************/
void Hardware_Init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断控制器分组设置
delay_init(); //systick初始化
LED_Init();
Usart1_Init(115200); //串口1,打印信息用
Usart3_Init(9600); //串口3,驱动SIM900A用
UsartPrintf(USART_DEBUG, " Hardware init OK\r\n");
}
/**************************************************************************/
//函数作用: 主函数
//函数名称: mian()
//外部部参数: 无
//修改日期: 2022年1月27日 21:35
//作者: (CSDN搜)大屁桃
//功能描述:
/*
单片机RCT6下入程序后现象如下:
首先,LED0亮两秒后发送英文短信,发送成功后关闭
随后,LED1亮两秒后发送中文短信,发送成功后关闭
最后,都发送成功后LED0和LED1闪烁
同时串口会一直打印消息
*/
/**************************************************************************/
int main()
{
/*SIM900A短信内容和号码*/
char English_message[]={"Hello!!"}; //英文短信内容
char phonenumber[]={"13225567263"}; //接受短信的号码
char Chinese_message[]={"4F60597D"}; //中文短信 内容对应于 你好
char Unicode_phonenumber[]={"00310033003200320035003500360037003200360033"};
Hardware_Init(); //初始化外围硬件
LED0 = 0; //LED0打开两秒后发送英文短信
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
/*SIM900A发送英文短信代码*/
sim900a_send_English_message(English_message,phonenumber); //发送信息的函数
LED0 = 1;
LED1 = 0; //LED1打开两秒后发送中文短信
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
/*SIM900A发送中文短信代码*/
sim900a_send_Chinese_message(Chinese_message,Unicode_phonenumber);
LED1 = 1;
while(1)
{
LED1 = 0; //发送成功后LED0和LED1闪烁
LED0 = 0;
delay_ms(500);
delay_ms(500);
LED1 = 1;
LED0 = 1;
delay_ms(500);
delay_ms(500);
}
}
第三部分、总结
1、效果图片和视频
这是我手机收到短信的截图,我是用我奶奶手机卡给自己的手机发的短息。这是视频链接,视频录制的有点撇