使用到的蓝牙模块为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);}}
手机下载一个蓝牙助手