蓝牙模块与数据包解析
蓝牙连接中有主机和从机,在建立通信连接前,从机要向外广播自己的信息,然后主机扫描到附近正在广播的蓝牙设备(子机)后就发起连接,连接建立后,双方就可以通过约定好的协议进行通信了。
蓝牙分为普通蓝牙,和低功耗蓝牙
低功耗蓝牙,包括诸多协议,如GAP广播协议,GATT协议,Service Characteristic等众多知识点。
连接步骤
1.更改波特率:
图形界面-> Connectivity -> 将与蓝牙模块连接的USART3开启为异步模式 -> 参数设置,将Baud Rate 改为蓝牙模块的默认波特率9600
2.开启NVIC 中断
在NVICSettings 中开启中断
3.添加DMA通道
DMA_Setting -> add 添加Rx和Tx 通道
保存后其串口为huart3
接着编写案列与5.1相同
数据包解析
发送数据包时,如何判断设备正确发送以及接收方是否接收到了正确的数据呢
就需要对数据包进行解析了,如规定,第一位起始位(包头)必须为0xAA 第二位必须为整串数据包的长度,后面为发送的数据包的信息,最后一位为前面整个数据的加和,这样就能保证数据的正确性。
有这样一个需求:发送格式为小灯编号+亮灭控制信号(重复)来进行发送来控制三盏小灯的亮灭
如
表示:红灯熄灭。
如
表示红灯熄灭,蓝灯开启
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
if (huart == &huart3) {
HAL_UART_Transmit_DMA(&huart3, 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 (message[Size-1]==sum) {
for (int i = 2; i < Size -1 ; i+=2) {
GPIO_PinState state = GPIO_PIN_RESET;
if (message[i+1]==0xFF) {
state = GPIO_PIN_SET;
}
if (message[i] == 0x01) {
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, state);
}else if (message[i] == 0x02) {
HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, state);
}else if (message[i] == 0x03) {
HAL_GPIO_WritePin(LED_BULE_GPIO_Port, LED_BULE_Pin, state);
}
}
}
}
}
HAL_UARTEx_ReceiveToIdle_DMA(&huart3, message, sizeof(message));
__HAL_DMA_DISABLE_IT(&hdma_usart3_rx,DMA_IT_HT);
}
}
标签:DMA,HAL,蓝牙,模块,GPIO,message,数据包
From: https://blog.csdn.net/m0_57852920/article/details/142887543