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);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值