STM32与SIM900A发送短信(三)

STM32通过SIM900A发送短信

目前本人初始化的为串口3,具体代码初始化如下:

#include "sys.h"
#include "usart3.h"	 
#include "stdarg.h"	 	 
#include "stdio.h"	 	 
#include "string.h"


/************************************************
STM32串口3:            XX模块
		PB10-------------RX 
		PB11-------------TX
************************************************/
void uart3_init(u32 bound)
{

	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	// GPIOB时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3时钟使能
 
 	USART_DeInit(USART3);  //复位串口3
		 //USART3_TX   PB10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10
   
    //USART3_RX	  PB11
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PB11
	
	USART_InitStructure.USART_BaudRate = bound;//波特率一般设置为9600;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity =USART_Parity_No;//无奇偶校验位USART_Parity_No
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
  
	USART_Init(USART3, &USART_InitStructure); //初始化串口	3
  
 
	USART_Cmd(USART3, ENABLE);                    //使能串口 
	
	//使能接收中断
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断   
	
	//设置中断优先级
	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
	
}

通过串口3的中断进行数据的接收

u8 i3=0;
u8 res3=0;
u8 Usart3_buff[128];       
void USART3_IRQHandler(void)
{
	
	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断
	{
		res3 = USART_ReceiveData(USART3); 
		Usart3_buff[i3]=res3;             //将接收的数据存放于数组中
		i3++;
	  if(Usart3_buff[i3]=='K')    //注意这种写法
		{
			i3=0;
		}
		USART_ClearFlag(USART3, USART_FLAG_RXNE);
	}
	
}

然后在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");

} 

/**************************************************************************/
//函数作用:发送中文短信函数
//函数名称: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");

} 


最后直接进行串口初始化,在主函数中使用即可。

printf("Q=1336811897")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值