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