蓝牙串口透传实战:HC-05与HM-10模块配置及数据通信全解析
👁 8 阅读 · 2026-08-21 · 嵌入式 蓝牙
蓝牙串口透传是嵌入式开发中实现无线数据传输的经典方案,HC-05(经典蓝牙)与HM-10(BLE 4.0)各有特性。本文深入解析两种模块的AT指令配置流程、串口通信原理,并给出基于STM32的完整代码示例,涵盖从硬件连接到数据收发的关键细节,帮助开发者快速上手并规避常见陷阱。
## 一、模块选型与原理概述
蓝牙串口透传模块本质是一个无线串口桥:MCU通过UART发送数据,模块将其封装为蓝牙协议包发出;接收端模块解包后从UART输出。开发者无需关心蓝牙协议栈,只需操作串口。
- **HC-05**:经典蓝牙2.0+EDR,支持主从模式切换,适合与手机/电脑配对,传输速率可达2Mbps(实际有效约1Mbps),但功耗较高。
- **HM-10**:BLE 4.0,仅支持从机模式(可配置为iBeacon),低功耗,适合电池供电设备,但传输速率受限(约5-10KB/s),且需支持BLE的主机(如手机4.0+)。
**选型建议**:若需高速率或与旧设备配对选HC-05;若追求低功耗或与手机APP通信选HM-10。
## 二、硬件连接与AT指令配置
### 2.1 硬件连接要点
| 模块引脚 | 接MCU | 说明 |
|---------|------|------|
| VCC | 3.3V(HC-05可接5V) | 注意HM-10必须3.3V,否则烧毁 |
| GND | GND | 共地 |
| TXD | MCU_RX | 交叉连接 |
| RXD | MCU_TX | 需分压(HC-05)或直接连(HM-10) |
| EN/KEY | MCU_PA0(示例) | 高电平进入AT模式 |
**关键点**:HC-05的RXD电平为3.3V,若MCU为5V需串联1K电阻分压;HM-10的RXD可容忍5V,但建议统一3.3V。
### 2.2 进入AT模式
- **HC-05**:按住模块上的按键上电,或上电前将EN接高电平,此时LED慢闪(约2秒一次),进入AT模式,波特率固定38400。
- **HM-10**:直接发送AT指令(默认波特率9600),无需特殊引脚,但部分版本需在未连接状态下。
### 2.3 常用AT指令配置
以下指令通过串口助手发送,每条指令以`\r\n`结尾(HC-05)或`\r\n`(HM-10,但部分版本仅需`\n`)。
**HC-05配置示例**(波特率38400):
```c
AT+NAME=MyHC05 // 设置名称
AT+ROLE=0 // 设为从机(1为主机,2回环)
AT+UART=9600,0,0 // 设置串口波特率9600,停止位1,无校验
AT+PSWD=1234 // 设置配对密码
AT+RESET // 重启生效
```
**HM-10配置示例**(波特率9600):
```c
AT+NAME=MyHM10 // 设置名称
AT+ROLE=0 // 从机模式(默认)
AT+BAUD0 // 设置波特率9600(0=9600, 1=115200等)
AT+ADDR? // 查询MAC地址
AT+RESET
```
**注意**:配置后需重新上电,且AT模式与透传模式切换(HC-05需拉低EN)。
## 三、STM32串口透传代码实现
以下代码基于STM32F103,使用USART1与蓝牙模块通信,USART2用于调试输出。实现功能:MCU将接收到的蓝牙数据原样回传,并打印到调试串口。
### 3.1 初始化配置
```c
// 初始化USART1(蓝牙)和USART2(调试)
void UART_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// 使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
// USART1_TX PA9, RX PA10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// USART2 TX PA2, RX PA3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// USART1 配置(与蓝牙模块波特率一致)
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_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_RX | USART_Mode_TX;
USART_Init(USART1, &USART_InitStructure);
// USART2 配置(115200调试)
USART_InitStructure.USART_BaudRate = 115200;
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
USART_Cmd(USART2, ENABLE);
// 使能接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
```
### 3.2 中断处理与数据回传
```c
// 发送单个字符
void UART_SendChar(USART_TypeDef* USARTx, uint8_t ch) {
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
USART_SendData(USARTx, ch);
}
// 发送字符串
void UART_SendString(USART_TypeDef* USARTx, const char* str) {
while (*str) {
UART_SendChar(USARTx, *str++);
}
}
// USART1中断服务函数
void USART1_IRQHandler(void) {
uint8_t data;
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
data = USART_ReceiveData(USART1);
// 回传蓝牙数据
UART_SendChar(USART1, data);
// 调试输出到USART2
UART_SendChar(USART2, data);
}
}
int main(void) {
// 初始化系统时钟等
UART_Init();
UART_SendString(USART2, "Bluetooth UART Test\r\n");
while (1) {
// 主循环可处理其他任务
}
}
```
## 四、数据通信测试与调试技巧
1. **手机端测试**:使用“蓝牙串口助手”APP(HC-05)或“BLE调试助手”(HM-10),配对后发送数据,观察MCU回传。
2. **逻辑分析仪**:若数据异常,用逻辑分析仪抓取UART波形,确认波特率、电平是否匹配。
3. **AT指令验证**:发送`AT`,HC-05返回`OK`,HM-10返回`OK`(部分版本返回`OK+`)。
4. **流控问题**:确保模块的CTS/RTS未连接(默认禁用),否则可能阻塞。
**常见问题排查**:
- 无法进入AT模式:检查EN引脚电平,HC-05需在上电前拉高。
- 数据乱码:波特率不一致,或HC-05的RXD电平不匹配。
- 连接不稳定:距离过远或干扰,尝试降低波特率。
## 五、注意事项与进阶建议
- **电源稳定性**:蓝牙模块峰值电流可达50mA,避免与电机共用电源,加100uF电容滤波。
- **电平转换**:5V MCU与HC-05通信时,务必分压,否则可能损坏模块。
- **HM-10的AT指令差异**:不同固件版本指令略有不同,以官方手册为准。
- **低功耗设计**:HM-10支持`AT+SLEEP`进入休眠,唤醒需外部中断或定时器。
- **多模块组网**:HC-05可配置为主机,实现一对一透传;HM-10支持广播,但需自定义协议。
**进阶方向**:可结合蓝牙模块实现OTA固件升级、远程传感器数据采集,或使用BLE的GATT自定义服务实现更复杂通信。
## 六、总结
HC-05与HM-10作为串口透传模块,极大简化了无线通信开发。掌握AT指令配置和串口中断处理是核心,本文提供的代码可直接移植。实际项目中,务必根据需求选择模块,并注意硬件细节。希望本文能帮助你快速构建稳定的蓝牙通信链路。