1. 初识HC-05:你的无线串口神器

HC-05蓝牙模块绝对是嵌入式开发中最受欢迎的无线通信模块之一,我用了这么多年还是觉得它最靠谱。简单来说,这玩意儿就是个"无线串口"——把你原来需要插线才能实现的串口通信,变成了无线连接。

想想这些场景:你的STM32需要把传感器数据传到电脑上,但拖着根线实在太麻烦;或者两个单片机之间要通信,布线又复杂又容易干扰。这时候HC-05就派上用场了,它用的是经典的蓝牙2.0协议,支持SPP(串口端口配置文件),说白了就是帮你把有线串口变成无线串口。

我特别喜欢HC-05的一点是它支持主从一体模式。什么意思呢?就是说同一个模块,既可以作为主机主动去连接别人,也可以作为从机等待别人来连接。这个特性特别实用,比如你可以让一个HC-05连接手机,另一个HC-05连接电脑,然后两个模块配对后,就相当于手机和电脑之间建立了无线串口连接。

模块的工作电压是3.3V到6V,推荐用5V供电,但要注意它的RXD引脚是3.3V电平,如果接5V的单片机,最好加个电平转换电路或者串个1k电阻。默认波特率是9600,但在AT指令模式下是38400,这个细节很多新手容易搞错,我在后面会详细说。

2. 硬件准备与接线指南

拿到HC-05模块后,第一件事就是正确接线。模块通常有6个引脚:VCC、GND、TXD、RXD、KEY、STATE。但实际使用时,我们主要用前4个引脚,KEY和STATE是可选的。

基础接线方法:

  • VCC接5V电源(模块内部有LDO稳压到3.3V)
  • GND接地
  • TXD接单片机或USB-TTL的RXD
  • RXD接单片机或USB-TTL的TXD

这里有个重要细节:TXD和RXD一定要交叉连接!也就是说,模块的TXD要接对方的RXD,模块的RXD要接对方的TXD。这个错误我见得太多了,很多新手接反了然后发现通信不了。

如果你要用AT指令配置模块,还需要处理KEY引脚:

  • KEY引脚悬空或接地时,模块处于正常工作模式
  • KEY引脚接高电平(3.3V-5V)时,模块进入AT指令模式

STATE引脚可以用来判断连接状态:

  • 未连接时输出低电平
  • 连接成功后输出高电平
  • 你可以接个LED灯来直观显示连接状态

实际接线示例: 用USB-TTL模块连接HC-05时:

HC-05    USB-TTL
VCC  ->  5V
GND  ->  GND
TXD  ->  RXD
RXD  ->  TXD
KEY  ->  悬空(正常模式)或3.3V(AT模式)

记得一定要共地!不共地会导致通信不稳定或者完全无法通信。我建议使用带杜邦线的USB-TTL模块,这样接线和调试都方便。

3. AT指令完全解析:从入门到精通

AT指令是配置HC-05的核心,但很多人在这一步卡住。让我来详细解释怎么正确使用AT指令。

进入AT模式的两种方法:

  1. 上电前按住KEY:断电状态下,按住模块上的KEY按钮(或者把KEY引脚接高电平),然后上电。这时候模块指示灯会变成慢闪(约2秒一次),表示进入AT模式
  2. 上电后按KEY:先正常上电,然后按一下KEY按钮,模块也会进入AT模式

第一种方法更可靠,我推荐用这种方法。在AT模式下,通信波特率固定为38400,数据格式8N1(8数据位、无校验、1停止位)。

常用AT指令清单:

AT           // 测试指令,返回OK表示通信正常
AT+VERSION?  // 查询固件版本
AT+NAME?     // 查询设备名称
AT+NAME=MyBT // 设置设备名称为MyBT
AT+PSWD?     // 查询配对密码
AT+PSWD=1234 // 设置配对密码为1234
AT+UART?     // 查询串口参数
AT+UART=115200,0,0 // 设置波特率115200,无校验,1停止位
AT+ROLE?     // 查询工作模式
AT+ROLE=1    // 设置为主机模式(0为从机)
AT+ADDR?     // 查询蓝牙地址
AT+BIND=1234,56,ABCDEF // 绑定指定地址的设备

重要提示:

  • 所有AT指令必须大写
  • 每条指令必须以\r\n结尾(在串口助手中勾选"发送新行")
  • 指令执行成功会返回OK,失败则返回ERROR或没有响应

我建议先用简单的AT指令测试,确认通信正常后再进行复杂配置。如果没响应,检查接线和波特率设置,很多时候问题就出在这两个地方。

4. 单模块实战:手机与电脑无线通信

现在我们来做个实际项目:让HC-05在手机和电脑之间建立无线串口通信。这个项目很实用,比如你可以用手机给电脑发送控制指令,或者把电脑的数据传到手机上看。

硬件连接:

  1. HC-05模块接USB-TTL,然后插到电脑USB口
  2. 手机安装蓝牙串口APP(如"蓝牙串口助手")

配置步骤:

  1. 让HC-05进入AT模式(KEY接高电平上电)
  2. 打开电脑串口助手,设置波特率38400
  3. 发送AT+NAME=MyBT设置设备名称
  4. 发送AT+PSWD=1234设置配对密码
  5. 发送AT+UART=9600,0,0设置通信波特率
  6. 断电重新上电(KEY悬空),进入正常工作模式

手机端操作:

  1. 打开手机蓝牙设置,搜索并配对"MyBT",密码1234
  2. 打开蓝牙串口APP,选择已配对的HC-05连接
  3. 连接成功后,模块指示灯会从快闪变为慢闪或者双闪

测试通信:

  • 在手机APP中输入"Hello"并发送,电脑串口助手应该显示"Hello"
  • 在电脑串口助手中输入"World"并发送,手机APP应该显示"World"

如果通信不正常,检查以下几点:

  • 模块是否已正确配对和连接(指示灯状态)
  • 串口波特率是否一致(默认9600)
  • TXD/RXD接线是否正确(一定要交叉!)

这个项目虽然简单,但包含了HC-05最基础的使用方法。掌握了这个,你就已经能用HC-05实现很多无线通信应用了。

5. 双模块互联:主从配置详解

单个HC-05玩转了,现在来挑战更高阶的:让两个HC-05模块互相通信。这需要配置一个为主机,一个为从机。

硬件准备:

  • 两个HC-05模块
  • 两个USB-TTL模块(或者一个模块分两次配置)
  • 杜邦线若干

配置步骤:

第一步:获取从机地址

  1. 从机模块(我们称为B模块)进入AT模式
  2. 发送AT+ADDR?查询地址,例如返回+ADDR:1234:56:ABCDEF
  3. 记下这个地址,后面主机配置要用

第二步:配置主机

  1. 主机模块(A模块)进入AT模式
  2. 发送AT+ROLE=1设置为主机模式
  3. 发送AT+BIND=1234,56,ABCDEF绑定从机地址 (注意:地址中的冒号要换成逗号)
  4. 发送AT+CMODE=0设置连接模式为指定地址
  5. 发送AT+PSWD=1234设置配对密码(要与从机一致)

第三步:配置从机

  1. 从机模块保持AT模式
  2. 发送AT+ROLE=0确保为从机模式
  3. 发送AT+PSWD=1234设置配对密码(与主机一致)
  4. 发送AT+CMODE=0设置连接模式为指定地址

第四步:测试连接

  1. 两个模块都断电,然后正常上电(KEY悬空)
  2. 主机模块会自动搜索并连接从机
  3. 连接成功后,两个模块的指示灯都会从快闪变为慢闪/双闪
  4. 用两个USB-TTL分别连接两个模块到电脑
  5. 打开两个串口助手,互相发送数据测试

常见问题解决: 如果两个模块无法连接,检查以下几点:

  • 地址绑定是否正确(冒号换逗号)
  • 配对密码是否一致
  • 工作模式设置是否正确(主机为1,从机为0)
  • 连接模式是否设置为0(指定地址模式)

我建议先用默认参数测试,成功后再尝试修改波特率、设备名称等参数。每个步骤都要确认模块返回OK再继续下一步。

6. 嵌入式集成:与STM32/Arduino配合使用

HC-05最强大的地方在于它可以轻松集成到嵌入式系统中。下面我以STM32和Arduino为例,展示如何将HC-05与单片机配合使用。

STM32连接示例:

// STM32硬件串口初始化
void USART2_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    
    // 使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    
    // 配置TX引脚(PA2)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 配置RX引脚(PA3)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 串口参数配置
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_Init(USART2, &USART_InitStructure);
    
    USART_Cmd(USART2, ENABLE);
}

// 发送字符串函数
void Bluetooth_SendString(char *str)
{
    while(*str) {
        USART_SendData(USART2, *str++);
        while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
    }
}

Arduino连接示例:

// Arduino使用SoftwareSerial库
#include <SoftwareSerial.h>

SoftwareSerial BT(10, 11); // RX, TX

void setup() {
  Serial.begin(9600);
  BT.begin(9600); // HC-05默认波特率
  Serial.println("Bluetooth is ready!");
}

void loop() {
  // 从蓝牙读取数据并发送到串口
  if (BT.available()) {
    char c = BT.read();
    Serial.write(c);
  }
  
  // 从串口读取数据并发送到蓝牙
  if (Serial.available()) {
    char c = Serial.read();
    BT.write(c);
  }
}

实际应用案例:蓝牙控制LED

// STM32实现蓝牙控制LED
char receivedData[256];
int dataIndex = 0;

void USART2_IRQHandler(void)
{
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {
        char c = USART_ReceiveData(USART2);
        
        if(c == '\n') { // 收到换行符表示命令结束
            receivedData[dataIndex] = '\0';
            
            if(strcmp(receivedData, "LED_ON") == 0) {
                GPIO_SetBits(GPIOA, GPIO_Pin_5); // 点亮LED
                Bluetooth_SendString("LED is ON\r\n");
            }
            else if(strcmp(receivedData, "LED_OFF") == 0) {
                GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 熄灭LED
                Bluetooth_SendString("LED is OFF\r\n");
            }
            
            dataIndex = 0;
        }
        else {
            receivedData[dataIndex++] = c;
        }
    }
}

这个例子展示了如何用手机通过蓝牙控制STM32上的LED灯。你可以在手机蓝牙串口APP中发送"LED_ON"和"LED_OFF"来控制LED的开关。

7. 高级应用与故障排除

当你掌握了基础用法后,可以尝试一些更高级的应用技巧。同时,了解常见故障的排除方法也很重要。

高级应用技巧:

  1. 波特率优化:默认9600波特率可能不够快,可以设置为115200甚至更高

    AT+UART=115200,0,0
    

    但要注意,修改后所有设备都要使用相同的波特率

  2. 电源管理:HC-05工作电流约30mA,配对后约10mA。如果用在电池供电设备中,可以考虑定时断电节能

  3. 多模块切换:主机模式可以绑定多个从机地址,通过AT指令切换连接对象

  4. 状态监控:利用STATE引脚输出,可以实时监控连接状态,在程序中做出相应处理

常见故障排除:

问题1:AT指令无响应

  • 检查KEY引脚是否正确接高电平
  • 确认波特率是否为38400(AT模式)
  • 检查TXD/RXD接线是否正确交叉
  • 确认电源电压足够(5V最佳)

问题2:模块无法配对

  • 确认两个模块的配对密码一致
  • 检查主机是否正确绑定了从机地址
  • 确认工作模式设置正确(主机为1,从机为0)

问题3:通信数据错误

  • 检查波特率设置是否一致
  • 确认数据格式(8N1)
  • 检查电源是否稳定,电压不足会导致数据错误

问题4:传输距离短

  • HC-05的标称距离是10米,但实际受环境影响
  • 避免金属屏蔽和强干扰源
  • 确保天线区域(模块顶部)没有被遮挡

问题5:频繁断开连接

  • 检查电源稳定性,电压波动会导致断开
  • 避免物理遮挡和强干扰源
  • 可以尝试降低波特率提高稳定性

我在实际项目中总结的经验是:HC-05是个很可靠的模块,大部分问题都是接线或配置错误导致的。只要耐心检查,都能找到解决方法。

记得在正式项目中使用时,要添加适当的错误处理机制,比如超时重发、数据校验等,这样才能保证通信的可靠性。蓝牙通信毕竟是无线的,受环境因素影响较大,好的程序设计可以大大提高系统的稳定性。

HC-05虽然是个"老将",但在很多应用中仍然非常实用。它的稳定性、丰富的资料和低廉的价格,使得它成为入门和中级项目的首选。希望这篇详细的教程能帮你快速掌握HC-05的使用技巧,顺利实现你的无线通信项目。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐