文章目录

  • 前言
  • 一、HC-05蓝牙是什么?
  • 二、应用实例步骤
  • 1.使用AT指令对蓝牙的初始化
  • 2.打开手机蓝牙助手查看是否搜索到该蓝牙
  • 3.用蓝牙模块代替TTL连接stm开发板
  • 4.创建项目开始配置相关配置和编写代码
  • 总结



前言

蓝牙是我们生活中非常常见的一个功能,也是嵌入式中用来远程操控的一个非常重要的功能,所以对于我们来说学习蓝牙是非常有必要的,以下是我在学习过程的收获。


一、HC-05蓝牙是什么?

HC-05蓝牙模块是嵌入式中使用最广泛的的蓝牙模块,因为蓝牙其实就相当于一个串口,可以使用相同的串口协议,可以通过手机连接该蓝牙模块,发送命令实现对stm32单片机控制的一系列应用。

二、应用实例步骤

1.使用AT指令对蓝牙的初始化

首先我们需要HC_05蓝牙模块进行AT命令初始化,也就是使用AT命令命名蓝牙名字,以及设置配对密码,接下来将蓝牙模块与串口助手连接,RXD对TXD,TXD对RXD,GND对GND,VCC对3.3V,然后打开串口助手,进行AT指令设置,如下图所示:

Android11源码蓝牙自动连接 蓝牙模块自动连接手机_嵌入式硬件

Android11源码蓝牙自动连接 蓝牙模块自动连接手机_arm_02

2.打开手机蓝牙助手查看是否搜索到该蓝牙(手机应用商店下载)

Android11源码蓝牙自动连接 蓝牙模块自动连接手机_数据_03

 3.用蓝牙模块代替TTL连接stm开发板

4.蓝牙其实就相当于一个串口,可以使用相同的串口协议,这里我们采用FreeRtos系统中的任务和消息队列用蓝牙实现对LED灯的控制,进入Cubemx新建一个工程,选好定时器和时钟后:

第一步,打开USART1,选择异步通信模式,并更改波特率为9600,因为蓝牙对应的波特率为9600:

第二步还需要打开USART1的中断,

第三步,添加任务和队列,需要添加两个任务,一个是控制灯的高低电平,一个是控制队列读取输入的字符处理,队列就是用来存放输入的字符串的, 

第五步,首先使能UART中断,如下所示:

__HAL_UART_ENABLE_IT(uartHandle,UART_IT_RXNE);

 

然后在中断里面写下去USART1的寄存器里面读取收到的数据也就是我们向蓝牙里面发送的数据装到一个容器中,然后再将数据发送到消息队列中,如下所示:

uint8_t data;
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
 
	if(__HAL_UART_GET_FLAG( &huart1,UART_FLAG_RXNE)== SET)
	{
	data=huart1.Instance->DR;//数据寄存器找数据找到基地址访问第一个成员//将收到的数据发送到消息队列中
	xQueueSendFromISR(myQueueHandle,&data,NULL);//第一个参数是队列的句柄第二个是发送的数据
	}
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

然后再freertos系统中的任务函数中写下将消息队列的数据放到一个数组中然后再输出出来,看是否正确,并且输一次都需要初始化数组,如下所示:

void Uart_input(void const * argument)
{
  /* USER CODE BEGIN Uart_input */
	uint8_t index=0;
  /* Infinite loop */
  for(;;)
  {
		index=0;
		memset(DataBuff,0,20); //初始化数组
		if(xQueueReceive(myQueueHandle,&DataBuff[index++],portMAX_DELAY)==pdPASS){ //如果接收到数据,就把数据放进databuff数组里面
			while(xQueueReceive(myQueueHandle,&DataBuff[index++],50)==pdPASS){}//一个字节一个字节的接收数据
				DataBuff[index]='\0';
				printf("%s\r\n",DataBuff);
			}
    osDelay(100);
  }
  /* USER CODE END Uart_input */
}

 然后再在一个任务函数中写收到的数据与这里的数据进行比较如果一样就实现所对应的功能,自己定义一个字符来打开灯或者关闭灯,就是如果数据一样就转换io口的高低电平来点亮台灯,这里对应的引脚是PA6,如下所示:

 

uint8_t DataBuff[20];
void Led_Task(void const * argument)
{
  /* USER CODE BEGIN Led_Task */
  /* Infinite loop */
  for(;;)
  {
    if(strncmp((const char*)DataBuff,"openled",8)==0)
		{		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);
				memset(DataBuff,0,20);
		}											
		if(strncmp((char*)DataBuff,"closeled",9)==0)
		{		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
				memset(DataBuff,0,20);
		}
    osDelay(100);
  }
  /* USER CODE END Led_Task */
}

然后我们需要在手机上下载一个蓝牙串口调试助手app,连接HC_05蓝牙模板进行使用,如下图所示:

Android11源码蓝牙自动连接 蓝牙模块自动连接手机_arm_04

 

 


总结

以上就是今天要讲的内容,本文仅仅简单介绍了蓝牙模块的基本使用,嵌入式的学习过程任重道远,我们需更加努力。