【STM32 HAL库】HC-05 蓝牙通信

理论

模块功能

将复杂的蓝牙协议简化为串口透传
即以HC-05作为串口与主机之间通信的桥梁,实现串口与主机的通信
本质上就是无线的串口通信

接线

在这里插入图片描述

HC-05STM32
TXRX
RXTX
GNDGND
VCC5V

应用

CubeMX配置

轮询模式发送

此模式可以串口重映射为printf
在这里插入图片描述

DMA模式发送

此模式串口重映射为printf异常
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Keil5代码

这里通过串口重定向的方式,实现HC-05发送数据到PC端
因为串口可以重定向为printf来打印数据,而HC-05本质上为无线的串口通信,原理一样,所以HC-05蓝牙通信也能重定向为printf
注意:USART需要配置为轮询模式

勾选 “Use MicroLIB”
在这里插入图片描述
添加头文件
在这里插入图片描述
重写fputc()函数
在这里插入图片描述

int fputc(int ch,FILE *f)
{
	uint8_t temp[1] = {ch};
	
	//采用轮询方式发送1字节数据
	HAL_UART_Transmit(&huart3,temp,1,2);
	return ch;
}

最后,你就能调用 printf() 完成HC-05的数据发送了!!!

常见问题

接收到的数据为乱码

  • 检查硬件接线,尤其是GND地线
  • 传输协议参数配置需一致,尤其波特率
  • 注意是否勾选 “Use MicroLIB”
### HC05蓝牙模块与STM32 HAL配合使用 #### 硬件连接 为了使HC-05蓝牙模块与STM32微控制器正常工作,硬件连接至关重要。通常情况下,HC-05通过UART接口与STM32相连。具体来说,HC-05的TXD引脚应接至STM32的RXD引脚;而HC-05的RXD则需接到STM32的TXD上[^1]。 #### 工程配置 在STM32CubeIDE环境中创建新项目时,选择目标MCU型号并初始化外设设置。对于本应用而言,主要关注USART(通用同步/异步接收发送器)参数设定。确保波特率匹配HC-05默认值9600bps,并启用中断模式以便实时处理数据收发事件。 #### 初始化HAL函数调用 利用STM32 HAL简化了底层驱动开发流程。针对USART通信部分,可采用如下方式完成初始化: ```c // 定义全局句柄变量用于管理USART资源 extern UART_HandleTypeDef huart1; void MX_USART1_UART_Init(void){ /* USART1 parameter configuration */ huart1.Instance = USART1; huart1.Init.BaudRate = 9600; // 设置波特率为9600 bps huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK){ Error_Handler(); } } ``` 上述代码片段展示了如何基于HALAPI来配置USART实例化对象`huart1`的各项属性,并最终执行初始化操作。 #### 数据传输功能实现 当准备就绪后,可以编写简单的应用程序逻辑来进行实际的数据交换测试。下面给出一段演示程序,该程序实现了从手机端向STM32发送命令字符串以控制板载LED灯状态的功能: ```c #include "main.h" #define LED_PIN GPIO_PIN_13 #define LED_PORT GPIOD char receivedData[20]; // 缓存区存储来自蓝牙的数据包 uint8_t dataLen = 0; void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void){ HAL_Init(); // 复位低层资源 SystemClock_Config(); // 配置系统时钟源 MX_GPIO_Init(); // 初始化GPIO引脚 MX_USART1_UART_Init();// 初始化USART通道 while(1){ if(HAL_UART_Receive_IT(&huart1, (uint8_t*)receivedData, sizeof(receivedData)) == HAL_OK){ // 如果成功接收到一帧完整的消息,则解析其内容 if(strcmp((const char *)receivedData,"ON") == 0){ HAL_GPIO_WritePin(LED_PORT, LED_PIN , SET); // 开启LED }else if(strcmp((const char *)receivedData,"OFF") == 0){ HAL_GPIO_WritePin(LED_PORT, LED_PIN , RESET); // 关闭LED } memset(receivedData,'\0',sizeof(receivedData)); // 清空缓冲区等待下一次输入 } HAL_Delay(100); // 延迟一段时间防止CPU占用过高 } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if(huart->Instance==USART1){ __HAL_UART_FLUSH_DRREGISTER(huart); // 清除寄存器中的残留字符 HAL_UART_Transmit(&huart1,(uint8_t*)"Command Received\r\n",strlen("Command Received\r\n"),1000); HAL_NVIC_ClearPendingIRQ(USART1_IRQn); // 清除挂起标志位 __HAL_UART_ENABLE_IT(huart,UART_IT_IDLE); // 启用IDLE线检测机制 } } ``` 此段代码不仅包含了基本的消息监听循环结构,还定义了一个回调函数用来响应每次接收完成后触发的中断请求。每当有新的有效负载到达时,会自动唤醒主线程进行下一步判断处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值