STM32驱动HC-04蓝牙模块:从零搭建无线串口通信
1. 认识HC-04蓝牙模块第一次接触HC-04蓝牙模块时我完全被它的小巧身材和强大功能震惊了。这个比指甲盖大不了多少的模块居然能让我的STM32开发板和手机实现无线对话HC-04本质上就是个无线串口转换器它把复杂的蓝牙通信协议封装成简单的串口操作让我们这些嵌入式开发者不用深入研究蓝牙协议栈就能快速上手。实测下来HC-04的工作电压是3.3V-6V建议直接用STM32开发板上的3.3V电源供电最稳。它的默认波特率是9600bps这个参数后面写代码时会用到。模块上有四个关键引脚需要特别注意VCC接电源正极GND接地TXD接MCU的RXDRXD接MCU的TXD。这里最容易踩的坑就是交叉连接我刚开始就犯过把TXD-TXD直连的错误结果数据死活传不过去。2. 硬件连接实战2.1 准备材料清单要完成这个实验你需要准备STM32最小系统板我用的是STM32F103C8T6HC-04蓝牙模块杜邦线若干USB转TTL模块用于调试安卓手机安装蓝牙串口助手APP2.2 接线示意图按照这个顺序连接绝对靠谱HC-04的VCC → STM32的3.3VHC-04的GND → STM32的GNDHC-04的TXD → STM32的PA10USART1_RXHC-04的RXD → STM32的PA9USART1_TX这里有个实用技巧先用USB转TTL模块测试蓝牙模块是否正常。把TTL模块的RX接HC-04的TXTX接HC-04的RX上电后模块指示灯应该开始慢闪用手机搜索蓝牙设备应该能看到HC-04的设备名。3. STM32串口配置3.1 初始化USART1我用的是HAL库初始化代码比标准库简洁很多void MX_USART1_UART_Init(void) { huart1.Instance USART1; huart1.Init.BaudRate 9600; 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(); } }3.2 中断接收配置要实现字符回显功能必须开启接收中断// 在main函数初始化部分添加 HAL_UART_Receive_IT(huart1, rx_data, 1); // 中断回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart-Instance USART1){ HAL_UART_Transmit(huart1, rx_data, 1, 100); HAL_UART_Receive_IT(huart1, rx_data, 1); // 重新开启接收 } }4. 手机端调试技巧4.1 推荐APP选择经过多次测试我发现蓝牙串口助手和Serial Bluetooth Terminal这两款APP最稳定。特别是后者支持自定义AT指令发送调试时特别方便。4.2 常见问题排查如果连接后数据收发不正常按这个顺序检查确认手机已成功配对HC-04默认配对密码是1234检查波特率是否设置为9600用逻辑分析仪抓取串口波形确认数据是否正常传输尝试降低通信速率到4800bps测试5. 进阶功能扩展5.1 AT指令配置虽然HC-04默认配置就能用但有时需要修改参数// 发送AT指令修改设备名 HAL_UART_Transmit(huart1, ATNAMEMyHC04\r\n, 15, 100);注意每条AT指令必须以\r\n结尾。实测发现HC-04的AT模式比较特殊需要先按住模块上的按键再上电才能进入AT模式此时指示灯会变成快闪。5.2 数据协议设计实际项目中我建议定义简单的通信协议// 示例协议帧格式 #pragma pack(1) typedef struct { uint8_t head; // 0xAA uint8_t cmd; // 命令字 uint8_t len; // 数据长度 uint8_t data[8]; // 数据域 uint8_t checksum;// 校验和 } BLE_Frame;这样处理可以避免数据粘包问题提高通信可靠性。我在智能家居项目中就用类似协议实现了多设备控制。6. 性能优化建议当传输大量数据时建议将波特率提高到115200需同步修改HC-04的AT参数使用DMA传输减少CPU占用添加软件流控XON/XOFF在应用层实现数据分包和重传机制有个坑要注意HC-04的缓冲区比较小连续发送大量数据会导致丢包。我的解决方案是每次发送不超过20字节并等待50ms再发下一包。7. 项目实战案例最近用HC-04做了个无线调试终端分享关键代码// 接收处理状态机 void ProcessBLEData(uint8_t data) { static uint8_t state 0; static BLE_Frame frame; switch(state){ case 0: // 等待帧头 if(data 0xAA) state; break; case 1: // 获取命令字 frame.cmd data; state; break; // ...其他状态处理 default: state 0; } }这个方案成功实现了STM32与手机的双向通信传输稳定性明显提升。整套代码我已经开源在GitHub上包含完整的工程文件。
