600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 基于STM32与GSM模块发送中英文短信

基于STM32与GSM模块发送中英文短信

时间:2020-07-04 15:38:56

相关推荐

基于STM32与GSM模块发送中英文短信

基于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;//TXGPIO_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;//RXGPIO_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 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//子优先级3NVIC_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或者USC2AT+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");//设置编码格式为USC2delay_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=\"00310033003400350036003700380039\"\r\n");//接受短信号码,在接受号码的每一个数字前加上003delay_ms(1000);USART2_Send_data("6C34886867096D416C3473B08C61");//发送内容格式为PDU格式,如果的短信格式为GSM格式需要转换为GSM格式delay_ms(5000);//这里最好延时5秒不然会出现发送短信不成功的现象USART2_Send_data_value(0x1a);//发送十六进制数0x1a表示发送内容结束

如果只想发一次短信内容的话,你可以在函数初始化时将这一部分先初始化,触发发送短信条件在发送内容。例:

USART2_Init(9600); //串口2初始化为9600USART2_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");//设置编码格式为USC2delay_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=\"00310033003400350036003700380039\"\r\n");//接受短信号码,在接受号码的每一个数字前加上003while(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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。