基于STM32CUBEMX,HAL库蓝牙通信

本文介绍了如何使用HC-05蓝牙模块与STM32单片机建立连接,通过AT指令配置蓝牙模块,包括设置波特率、名称和密码。在STM32CubMX中配置串口和中断,然后在Keil代码中处理接收数据的中断服务程序,根据接收到的数据触发不同操作。实验中,通过发送特定ASCII码序列进行通信,并提供了在电脑端显示信息的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 蓝牙通信(实现手机与stm32连接)

1.准备工作

  • 蓝牙模块HC-05模块
  • 安卓APP软件

HC-05蓝牙模块支持AT指令。要进入AT指令模式,需要先按住蓝牙模块上的按键,接通电源,当模块上的LED灯进入慢闪后再松开按键,此时已经进入AT指令模式,可以进行AT指令设置1

常用的AT指令包括:

AT+VERSION?

返回HC-05的软件版本号

AT+NAME?

返回HC-05的名字

AT+UART?

返回蓝牙波特率

AT+UART=115200,0,0

设置串口波特率115200,1位停止位,无校验位

AT+NAME=bluetooth

修改蓝牙模块的名字为bluetooth

AT+PSWD?

查询配对密码

AT+PSWD=”1234”

设置密码1234

AT+ROLE?

查询主从状态,=1:设置成主,=0:设置成从,=2:设置成回环

AT+ROLE=0

设置成从

AT+ORGL

恢复出厂默认设置。

2.stm32cubemx设置

设置和串口一样,因为需要用到中断,所以我们需要打开中断。

我们打开2个串口。UART5连接蓝牙模块。

3.keil代码

基础配置一下

usart.c下

/* USER CODE BEGIN 1 */
char Buff[255];//存储数据
uint8_t Data;	//暂存数据
int Cnt = 0;	//计数

void  HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart)
{
    if(huart ==&huart5)
    {
      
			Buff[Cnt++] = (char)Data;
			if(Buff[Cnt-1] == 0x0A && Buff[Cnt-2] == 0x0D)//判断是否为回车结尾  
			{
			
							if(Buff[Cnt-3] == 0x01)
							{
								flag = 1;
							}
							if(Buff[Cnt-3] == 0x02)
							{
								flag = 2;
							}
							if(Buff[Cnt-3] == 0x03)
							{
								flag = 3;
							}
							if(Buff[Cnt-3] == 0x04)
							{
								flag = 4;
							}
							if(Buff[Cnt-3] == 0x05)
							{
								flag = 5;
							}							
 							if(Buff[Cnt-3] == 0x06)
							{
								flag = 6;
							}
			}							
        HAL_UART_Receive_IT(&huart5,(uint8_t *)&Data,sizeof(Data));
    }
}


///重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
	/* 发送一个字节数据到串口DEBUG_USART */
	HAL_UART_Transmit(&huart5, (uint8_t *)&ch, 1, 1000);	
	
	return (ch);
}
/* USER CODE END 1 */

 usart.h

/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */

/* USER CODE BEGIN Private defines */
extern char Buff[255];//存储数据
extern uint8_t Data;	//暂存数据
extern int Cnt;	//计数
extern int flag;
/* USER CODE END Private defines */

 main.c

/* USER CODE BEGIN PTD */
	int flag;
/* USER CODE END PTD */

  /* USER CODE BEGIN 2 */
  HAL_UART_Receive_IT(&huart5,(uint8_t *)&Data,sizeof(Data));
  /* USER CODE END 2 */

  /* USER CODE BEGIN WHILE */
  while (1)
  {
	      switch(flag)    
    		 {
    		 case(1):
				 printf("1");
			 break;
    		 case(2):
				 printf("2");
			 break;
    		 case(3):
				 printf("3");
			 break;
    		 case(4):
				 printf("4");
			 break;
    		 case(5):
				 printf("5");
			 break;
			 case(6):
				 printf("6");
			 break;
    		 default:
				 printf("0");
				 break;
    		 } 
			 HAL_Delay(1000);
    /* USER CODE END WHILE */

 

4.实验现象

发送01 0D 0A(0D 0A是两个ASCII码,分别代表回车(CR)和换行(LF))

发送02 0D 0A

如果需要在电脑上显示,我们把发送给手机的端口huart5改成huart1就可以了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值