Bootstrap

【STM32】蓝牙模块&数据包解析

使用到的蓝牙模块为DX-BT24,他可以将串口转蓝牙,实现与手机蓝牙的通信,本次实现使用手机蓝牙发送数据包来控制单片机LED的亮灭,规则如下:
AA 05 01 FF AF 该数据包表示包头为AA,05表示该数据包的大小,01表示蓝灯 FF表示亮 AF为校验和,是前面数据相加后的后两位用来检验数据传输的准确性
在这里插入图片描述
AA 05 02 00 B1 表示绿灯灭
在这里插入图片描述

也就是 包头 +数据大小+哪个灯+灯状态+校验和,
因为可以同时设置所有灯的状态如下:
AA 09 01 FF 02 FF 03 00 B7
在这里插入图片描述
所以不确定数据包大小就可以用不定长数据接收
在这里插入图片描述
按照电路图接线,然后使用串口3来进行通信,rx接tx,tx接rx

代码实现:
在这里插入图片描述

在这里插入图片描述

解析数据包代码实现:
在这里插入图片描述

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{

    if(huart==&huart3)
    {
    	HAL_UART_Transmit_DMA(&huart3,(uint8_t*)message, Size);

         // 解析数据包代码
          if(message[0]==0XAA)//包头检验
          {

        	  if(message[1]==Size)//数据个数检验
        	  {
                  uint8_t sum=0;
                  for(int i=0;i<Size-1;i++)
                  {

                	  sum+=message[i];





                  }
                    if(sum==message[Size-1])//校验和检验
                    {

                    	for(int i=2;i<Size-2;i+=2)
                    	{
                    		GPIO_PinState  state=GPIO_PIN_RESET;
                    		if(message[i+1]==0XFF)
                    		{

                    			state=GPIO_PIN_SET;


                    		}
                    		if(message[i]==0X01)
                    		{
                    			HAL_GPIO_WritePin(BLUE_LED_GPIO_Port,BLUE_LED_Pin, state);


                    		}
                    		else if(message[i]==0X02)
                    		{
                    			HAL_GPIO_WritePin(GREEN_LED_GPIO_Port,GREEN_LED_Pin, state);


                    		}
                    		else if(message[i]==0X03)
                    		{
                    			HAL_GPIO_WritePin(RED_LED_GPIO_Port,RED_LED_Pin, state);




                    		}






                    	}





                    }






        	  }








          }

 HAL_UARTEx_ReceiveToIdle_DMA(&huart3, (uint8_t*)message,sizeof(message));
    	  __HAL_DMA_DISABLE_IT(&hdma_usart3_rx,DMA_IT_HT);

    }


}

手机下载一个蓝牙助手
在这里插入图片描述
在这里插入图片描述

;