在邻居家放飞梦想的隔壁老王 2019-06-20 16:46 采纳率: 0%
浏览 249

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

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

  • 写回答

1条回答

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-25 19:51
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接: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 蓝牙模块配对过程配置,配对完成之后连个蓝牙就可以进行通信了


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

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮