开启UART3异步模式,配置波特率9600。
开启USART3中断,添加DMA 通道。
将蓝牙模块连接到开发板上注意引脚对应
数据回显
if(huart == &huart3){ HAL_UART_Transmit_DMA(&huart3, receiveData, Size); } 当确认是串口3的回调事件后,立即通过DMA将接收到的数据原封不动发回帧头与长度校验
if(receiveData[0] == 0xAA){ if(receiveData[1] == Size){ 协议约定帧头为 0xAA ,并通过 receiveData[1] 存储的预期长度,和实际接收长度 Size 做比对。和校验验证
uint8_t sum = 0; for(int i = 0; i < Size - 1; i++){ sum += receiveData[i]; } if(sum == receiveData[Size-1]){ 计算除最后一个字节外所有数据的累加和,再与最后一个字节(校验位)比对。LED控制
for(int i=2; i<Size-1; i+=2){ GPIO_PinState state = GPIO_PIN_SET; if(receiveData[i+1] == 0x00){ state = GPIO_PIN_RESET; } if(receiveData[i] == 0x01){ HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, state); }else if(receiveData[i] == 0x02){ HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, state); }else if(receiveData[i] == 0x03){ HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, state); } } ( receiveData[i] ):指定LED通道( 0x01 =红、 0x02 =绿、 0x03 =蓝)。 ( receiveData[i+1] ):指定LED状态( 0x00 =熄灭、非0=点亮)。 这种“通道+状态”的指令格式,支持同时控制多个LED。HAL_UARTEx_ReceiveToIdle_DMA(&huart3, receiveData, sizeof(receiveData)); HAL_DMA_DISABLE_IT(&hdma_usart3_rx, DMA_IT_HT); 重新开启下一轮的空闲帧DMA接收,保证串口通信的连续性。 关闭DMA的半传输中断( DMA_IT_HT ),避免半满时触发不必要的中断,仅保留空闲中断触发回调。