如何STM32F407加速度模块控制GSM通信模块?

基于STM32F407板子,用加速度模块提供的数据控制GSM通信模块发短信

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:STM32F1与GSM-SIM900A模块短信测试
  • 除此之外, 这篇博客: stm32f407两个蓝牙模块通信配置中的 STM32f407两个蓝牙模块通信配置 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    蓝牙模块使用的是XY_MBD07,XY-MBD07A 模块有两种工作模式: AT 指令工作模式,串口数据透传模式。模组未建立连接时模块处于 AT指令工作模式,当模块建立连接后模块处于串口数据透传模式。当模块建立连接后, CMD_DATA_SWITCH 引脚接低电平,模块会进入 AT 指令工作模式。

    配置过程

    1. 串口配置

    这里使用的是串口4

    void uart4_init(u32 bound)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	USART_InitTypeDef USART_InitStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    	
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);
    	
    	GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_UART4); 
    	GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_UART4); 
    	
    	//UART4端口配置
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; 
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
    	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
    	GPIO_Init(GPIOC,&GPIO_InitStructure); 
    
       //UART4 初始化设置
    	USART_InitStructure.USART_BaudRate = bound;//波特率设置
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
    	USART_Init(UART4, &USART_InitStructure); //初始化串口4
    				
    	USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//开启相关中断
    	
    	//Uart4 NVIC 配置
    	NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级2
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;	   //子优先级1
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
    	NVIC_Init(&NVIC_InitStructure);	
    	
    	USART_Cmd(UART4, ENABLE);  
    }
    
    1. 串口中断配置
    uint8_t Fcount;
    uint8_t Scount;
    uint8_t tempData[20][50];
    volatile uint8_t okFlag;
    volatile uint8_t completeFlag;
    uint8_t buff[20];
    volatile uint8_t conectFlag;
    uint8_t i,len,j;
    void UART4_IRQHandler(void) 
    {
    	if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
    	{
    		
    		USART_ClearITPendingBit(UART4, USART_IT_RXNE);
    		tempData[Fcount][Scount++] = USART_ReceiveData(UART4);
    
    		//判断结束标志
    		if( (tempData[Fcount][Scount-2]=='\r') && (tempData[Fcount][Scount-1]=='\n') )
    		{
    			Scount = 0;
    			if(strcmp(tempData[Fcount],"OK\r\n")==0)   //返回OK
    			{
    				okFlag=1;
    				Fcount=0;
    				memset(tempData[Fcount],0,sizeof(tempData[Fcount]));
    			}else if(strcmp(tempData[Fcount],"SCAN Completed\r\n")==0)  //扫描完成返回  SCAN Completed
    			{
    				completeFlag =1;
    
    				for(i=0;i<Fcount;i++)
    				{
    					len = strlen(tempData[i]);
    					if(tempData[i][len-7]=='F'&&tempData[i][len-6]=='S')  //扫描到名字带有FS的 蓝牙名字设置的是FS101/2/3...
    					{
    						
    						conectFlag=1;
    						for(j=0;j<12;j++)
    						{
    							buff[j]=tempData[i][j];   //把扫描到的12位蓝牙地址存到buff
    						}
    						memset(tempData,0,sizeof(tempData));
    						break;
    					}
    					memset(buff,0,sizeof(buff));
    				}
    				count1 = 0;
    				memset(tempData,0,sizeof(tempData));
    					
    			}
    			else
    			{
    				Fcount += 1;
    			}		
    		}
    	}
     }
    
    1. 串口发送配置
     void UART4_SendData(uint8_t *sen_buf,uint8_t sen_len)
    {
    
    	while(sen_len--)
    	{
    		USART_SendData(UART4, *(sen_buf++);
    		while(USART_GetFlagStatus(UART4, USART_FLAG_TXE) == RESET); // Wait for Empty	
    	}
    }
    
    1. 主函数
    #include "sys.h"
    #include "delay.h"
    #include "usart.h"
    
    extern uint8_t okFlag;          //返回OK标志
    extern uint8_t completeFlag;    //扫描完成标志
    extern uint8_t conectFlag;      //获取地址成功标志
    extern uint8_t Fcount;
    extern uint8_t buff[20];
    uint8_t connectbuff[50];
    //设置波特率
    uint8_t buletooth_set(uint8_t *data1,uint8_t *data2)
    {
    
    	UART4_SendData(data1,strlen((char *)data1)); //设置波特率
    	delay_ms(100);
    	 if(okFlag)
    	 {
    		 okFlag=0;
    		 UART4_SendData(data2,strlen((char *)data2));//开启串口流
    		 delay_ms(100);
    		 if(okFlag)
    		 {
    			okFlag=0;
    			return 1;
    		 }
    	 }
    	 return 0;
    }
    
    
    //蓝牙连接
    uint8_t buletooth_connect(uint8_t *data)
    {
    
    	UART4_SendData(data,strlen((char *)data));//扫描
    	delay_ms(1000);
    	delay_ms(1000);
    	delay_ms(1000);
    	//printf("扫描中...\r\n");
    	if(completeFlag)
    	{
    		completeFlag=0;
    		delay_ms(1000);
    		if(conectFlag)
    		{
    			conectFlag=0;
    			Fcount=0;
    			sprintf(connectbuff,"AT+SCAN=%s\r\n",buff);
    			while(okFlag==0)UART4_SendData(connectbuff,strlen((char *)connectbuff));//发送连接指令
    			memset(buff,0,sizeof(buff));
    			okFlag=0;
    			return 1;	
    		}
    	}
    	memset(buff,0,sizeof(buff));
    	return 0;
    }
    
    int main()
    {
    	uint8_t uartbuff[50]="AT+URATE=115200\r\n";
    	uint8_t strbuff[20]= "AT+FC=1\r\n";
    	uint8_t i=0;
    	uint8_t scanbuff[20]="AT+SCAN?\r\n";
    
    	delay_init(168);  								//时钟初始化
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置
    	//uart1_init(115200);  	//串口初始化
    	uart4_init(115200);
        MAX262_Init();
    
    
    	while(buletooth_set(uartbuff,strbuff)== 0) delay_ms(500);   //蓝牙设置
    	//printf("设置成功\r\n");
    	while(buletooth_connect(scanbuff)==0)delay_ms(1000);        //蓝牙配对
    	//printf("配对成功\r\n");
    
    	while(1);
    }
    

    以上就是XY-MBD07A 蓝牙模块配对过程配置,配对完成之后连个蓝牙就可以进行通信了


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^