自学内容网 自学内容网

6-蓝牙模块与数据包解析

蓝牙模块与数据包解析

在这里插入图片描述

蓝牙连接中有主机和从机,在建立通信连接前,从机要向外广播自己的信息,然后主机扫描到附近正在广播的蓝牙设备(子机)后就发起连接,连接建立后,双方就可以通过约定好的协议进行通信了。

蓝牙分为普通蓝牙,和低功耗蓝牙

低功耗蓝牙,包括诸多协议,如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);
}
}

原文地址:https://blog.csdn.net/m0_57852920/article/details/142887543

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!