STM32与HC-05蓝牙模块实战:从AT指令配置到无线透传应用
2026/7/16 1:22:34 网站建设 项目流程

1. HC-05蓝牙模块基础认知与硬件准备

第一次接触HC-05蓝牙模块时,我被它的小巧身材和强大功能惊艳到了。这个比硬币大不了多少的模块,竟然能轻松实现无线数据传输!作为嵌入式开发者,我们最需要的就是这种即插即用的无线解决方案。

HC-05本质上是个蓝牙转串口的透明传输模块,支持主从一体双模式。我手头的这个模块有6个引脚,但实际常用的是4个:VCC(3.3-6V)、GND、TXD和RXD。实测中发现,用5V供电时通信距离最远能达到10米,而3.3V时稳定性更好但距离会缩短到5米左右。

硬件连接时有个容易踩的坑:TX/RX交叉连接!模块的TXD要接STM32的RXD,模块的RXD接STM32的TXD。去年帮学弟调试时,他因为直连烧坏了一个蓝牙模块,所以这里要特别提醒。建议先用USB-TTL模块测试蓝牙模块是否正常,再接STM32。

必备工具清单:

  • 两块HC-05模块(主从各一)
  • STM32F103开发板(我用的是Blue Pill)
  • USB-TTL转换器(推荐CH340G)
  • 杜邦线若干(最好用彩色的区分电源和信号线)
  • 串口调试助手(个人推荐XCOM V2.2)

注意:模块上那个不起眼的按键很重要!长按它再上电可以进入AT指令模式,此时LED会变成慢闪(约2秒一次),而正常工作模式是快闪(每秒2次)。这个状态指示灯对调试非常关键。

2. AT指令配置实战详解

配置HC-05就像给新手机设置网络一样,需要先用AT指令"告诉"它该怎么工作。下面是我总结的配置流程,经过三个实际项目验证:

2.1 进入AT指令模式

首先确保模块处于AT模式:

  1. 断开电源,按住模块上的按键不放
  2. 保持按住的同时接上电源
  3. 等待LED变为慢闪后松开按键
  4. 打开串口助手,设置波特率38400(多数模块默认值)

发送AT测试,应该会返回OK。如果没反应,可能是波特率不对,可以尝试9600、115200等常见值。我遇到过一批模块默认是115200,害我调试了半天。

2.2 主从模式配置

两个模块需要分别配置:

# 主机配置 AT+ORGL # 恢复出厂设置 AT+PSWD="1234" # 设置配对密码 AT+ROLE=1 # 设为主机模式 AT+CMODE=0 # 指定地址连接 # 从机配置 AT+ORGL AT+PSWD="1234" AT+ROLE=0 # 设为从机模式 AT+ADDR? # 查询从机地址(记下这个地址)

2.3 绑定与波特率设置

拿到从机地址后(格式如98d3:35:cd33),在主机上执行:

AT+BIND=98d3,35,cd33 # 注意替换冒号为逗号 AT+UART=115200,0,0 # 统一波特率

这里有个实用技巧:如果项目需要低功耗,可以把波特率设为9600;如果需要高速传输,可以尝试460800。我在智能车项目中使用115200的波特率,实测传输图像数据也很稳定。

3. STM32硬件连接与驱动开发

3.1 电路连接示意图

HC-05模块 STM32F103 VCC ----> 3.3V/5V GND ----> GND TXD ----> PA10(RX) RXD ----> PA9(TX) KEY ----> 悬空或接控制引脚

建议在VCC和GND之间加个100uF电容,能有效避免电源干扰导致的通信异常。曾经有个项目因为电机干扰导致蓝牙频繁断连,加电容后问题立刻解决。

3.2 串口初始化代码

使用STM32CubeMX生成USART1初始化代码后,需要添加中断接收功能:

// usart.c中添加 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1){ // 处理接收到的数据 HAL_UART_Receive_IT(&huart1, &rx_data, 1); // 重新启用中断 } }

实测发现,直接用HAL库的阻塞式发送在115200波特率下会有明显延迟,推荐使用DMA或中断方式:

// 非阻塞发送函数 void Bluetooth_Send(uint8_t *data, uint16_t len) { HAL_UART_Transmit_IT(&huart1, data, len); while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX); }

4. 无线透传实现与调试技巧

4.1 数据收发测试

主函数中可以这样测试:

while(1){ if(bluetooth_connected){ char msg[] = "Hello HC-05\r\n"; HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 100); HAL_Delay(1000); } }

在手机端安装"蓝牙串口助手"APP,搜索到HC-05并连接后,应该能看到每秒收到的"Hello HC-05"消息。

4.2 常见问题排查

  1. 无法连接

    • 检查主从模式是否设反
    • 确认密码一致
    • 用AT+STATE?查看状态
  2. 数据丢失

    • 降低波特率测试
    • 检查电源稳定性
    • 缩短模块间距排除干扰
  3. 异常复位

    • 检查电源电流是否足够
    • 避免模块长时间高温工作

有个隐蔽的坑:部分HC-05模块的EN引脚需要上拉,否则会随机复位。遇到不稳定情况时可以尝试给EN脚接10k上拉电阻到VCC。

5. 进阶应用:智能小车控制实例

去年给学校智能车比赛做的蓝牙遥控系统,核心代码如下:

// 命令解析示例 void Parse_Command(uint8_t cmd) { switch(cmd){ case 'F': Motor_Forward(); break; case 'B': Motor_Back(); break; case 'L': Motor_TurnLeft(); break; case 'R': Motor_TurnRight(); break; case 'S': Motor_Stop(); break; } }

配合手机APP发送单字符指令,实现了实时遥控。关键点是增加了50ms的指令间隔检测,防止快速连续指令导致电机驱动过热。

6. 性能优化建议

  1. 数据分包处理

    #define PACKET_SIZE 32 uint8_t buffer[PACKET_SIZE]; void Process_Packet(void) { // 添加CRC校验等 }
  2. 低功耗模式

    • 设置AT+SLEEP=1启用睡眠
    • 通过KEY引脚唤醒模块
  3. 天线优化

    • 避免金属物体遮挡
    • 模块天线朝上放置时信号最佳

最近发现有些国产兼容模块性能也不错,价格只有原装的一半,但AT指令可能略有不同。购买时建议选择带底板、有状态灯的版本,调试起来方便很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询