基于STM32与GSM模块发送中英文短信
最近在做毕业设计有用到GSM模块进行短信报警,模块的功能比较多这里就不介绍了,一般的拨打电话都很简单就只需要一条指令即可,发送英文短信也很简单也只要几条命令也不要其余很麻烦的工作,但是发送中文短息就麻烦了,相信在找GSM模块发送中文短信的你也已经找了不少的资料了,但是都需要写很多乱起八糟的东西,看着都头大,下面笔者教你如何快速实现中文短信报警。
串口配置
GSM与STM32是通过串口发送指令的方式进行,这个相信大家都会笔者就不哆嗦了。下面是笔者的串口配置。不会的可以参考一下。(笔者采用STM32F103c8t6)
#include "GSM_usart2.h"
void USART2_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructer;
USART_InitTypeDef USART_InitStructer;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructer.GPIO_Pin = GPIO_Pin_2;//TX
GPIO_InitStructer.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructer.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructer);
GPIO_InitStructer.GPIO_Pin = GPIO_Pin_3;//RX
GPIO_InitStructer.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructer.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructer);
//Usart2 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
USART_InitStructer.USART_BaudRate = bound;
USART_InitStructer.USART_WordLength = USART_WordLength_8b;
USART_InitStructer.USART_StopBits = USART_StopBits_1; //设置停止位
USART_InitStructer.USART_Parity = USART_Parity_No ; //设置校检位
USART_InitStructer.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //关闭硬件控制模式
USART_InitStructer.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //使能
USART_Init(USART2,&USART_InitStructer);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
USART_Cmd(USART2, ENABLE);
}
void USART2_Send_data(char *str)//用于发送字符串(GSM模块需要接受的命令)
{
while(*str != '\0')
{
while(USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET);
USART_SendData(USART2,*str);
str++;
}
}
void USART2_Send_data_value(u8 dat)//用于发送十六进制数
{
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==0);
USART_SendData(USART2,dat);
}
u8 Rec;
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Rec = USART_ReceiveData(USART2); //读取接收到的数据
}
}
1、发送英文短信
不说废话直接上代码:
USART2_Send_data("AT+CMGF=1\r\n"); //短信格式设置为文本模式
delay_ms(2000);//这里的延时可以更改但不能低于500MS如果太快模块接收不了
USART2_Send_data("AT+CMGS=\"150xxxxxxx\"\r\n");//短信接受号码
delay_ms(2000);
USART2_Send_data("hello_word\r\n");//发送短信内容
delay_ms(5000);
USART2_Send_data_value(0x1a); //发送回车结束符
2、发送中文短信
重点来了,相信你在网络上看到很多发送中文短信什么需要获取短信中心号码,需要将什么乱起八糟的东西进行转换,看着都头痛。
其实没那么复杂除了需要将你发送的中文短信内容转换一下格式就可以其余的都是指令,一看就会,只要你可以在串口上调试成功,基本程序上就没什么问题。
发送中文短息的指令如下:
AT+CMGF=?//1为文本模式,0为PDU模式。
AT+CSCS=?//短信编码格式,GSM或者USC2
AT+CSMP=?//数据编码格式
AT+CSCS?//模块会自动获取短息中心号码,不需要自己去查询
AT+CMGS=?//短信接受号码(在接受号码前每个数字前都加上003这是固定格式)
//串口调试的话出现“>”输入PDU格式的中文短信内容
0x1a//发送结束标志
看完上面的指令你是否觉得感觉好像也不难挺简单的,就几条指令。下面就只需要将代码移植到程序中了。
将中文使用在线转换网址:PDU GSM将内容转换为PDU格式。
方法:
将第五步的内容复制到你发送的内容即可,下面是代码,都有注释,笔者就不哆嗦了。
USART2_Send_data("AT\r\n");//建立连接
delay_ms(500);//延时是必须的太快了模块接受不了。(笔者试了一下500MS是可以的如果不行增加延时即可)
USART2_Send_data("AT+CMGF=1\r\n");//设置短信消息格式为文本模式
delay_ms(500);
USART2_Send_data("AT+CSCS=\"UCS2\"\r\n");//设置编码格式为USC2
delay_ms(500);
USART2_Send_data("AT+CSCS?\r\n");//自动获取短信中心号码
delay_ms(500);
USART2_Send_data("AT+CSMP=17,167,0,25\r\n");//数据编码格式,24发送英文,25发送中文
delay_ms(500);
USART2_Send_data("AT+CMGS=\"003100320033003400350036003700380039\"\r\n");//接受短信号码,在接受号码的每一个数字前加上003
delay_ms(1000);
USART2_Send_data("6C34886867096D416C3473B08C61");//发送内容格式为PDU格式,如果的短信格式为GSM格式需要转换为GSM格式
delay_ms(5000);//这里最好延时5秒不然会出现发送短信不成功的现象
USART2_Send_data_value(0x1a);//发送十六进制数0x1a表示发送内容结束
如果只想发一次短信内容的话,你可以在函数初始化时将这一部分先初始化,触发发送短信条件在发送内容。例:
USART2_Init(9600); //串口2初始化为9600
USART2_Send_data("AT\r\n");//建立连接,按道理这里应该要做返回检测。
delay_ms(500);//延时是必须的太快了模块接受不了。(笔者试了一下500MS是可以的如果不行增加延时即可)
USART2_Send_data("AT+CMGF=1\r\n");//设置短信消息格式为文本模式
delay_ms(500);
USART2_Send_data("AT+CSCS=\"UCS2\"\r\n");//设置编码格式为USC2
delay_ms(500);
USART2_Send_data("AT+CSCS?\r\n");//自动获取短信中心号码
delay_ms(500);
USART2_Send_data("AT+CSMP=17,167,0,25\r\n");//数据编码格式,24发送英文,25发送中文
delay_ms(500);
USART2_Send_data("AT+CMGS=\"003100320033003400350036003700380039\"\r\n");//接受短信号码,在接受号码的每一个数字前加上003
while(1)
{
if(Water_Detection() == 0)
{
delay_ms(1000);
USART2_Send_data("6C34886867096D416C3473B08C61");//发送内容格式为PDU格式,如果的短信格式为GSM格式需要转换为GSM格式
delay_ms(5000);
USART2_Send_data_value(0x1a);//发送十六进制数0x1a表示发送内容结束
}
}
好了笔者的分分享就到这里结束了,有不足的地方还请大家指正,喜欢的对你有用的小伙伴点个赞吧!
串口完整代码及GSM模块的指令功能资料链接:资料
提取码:anm9