2、蓝牙通信基础:蓝牙协议栈、经典蓝牙与BLE区别、串口透传原理、HC-05/HC-06模块介绍
蓝牙通信是智能小车与外部设备(手机、平板、PC)进行无线数据交换的核心通道。在《蓝牙串口控制小车与传感器联动项目实战》课程中,理解蓝牙通信的底层机制、协议分层以及不同蓝牙标准的适用场景,是正确选型、调试和优化无线链路的前提。本章将系统梳理蓝牙协议栈的架构、经典蓝牙与低功耗蓝牙(BLE)的本质差异、串口透传(SPP)的工作原理,并深入解析HC-05与HC-06两款常用模块的硬件特性、AT指令配置方法及实战选型要点。
上图从三个维度概括了本章的核心内容:左侧为蓝牙协议栈的分层结构,中间对比了经典蓝牙与BLE在速率、功耗和应用场景上的差异,右侧则聚焦于HC-05与HC-06模块的选型要点,底部展示了串口透传的完整数据链路。这张图可以作为后续章节调试时的参考索引。
2.1 蓝牙协议栈:从射频到应用的分层协作
蓝牙协议栈是蓝牙设备实现无线通信的软件与硬件协同框架。对于嵌入式开发者而言,不需要逐层实现协议栈,但理解其分层逻辑有助于定位通信故障、选择合适的通信模式以及优化数据传输效率。协议栈自下而上分为物理层、基带与链路控制层、链路管理层、逻辑链路控制与适配协议(L2CAP)、RFCOMM/SPP层以及应用层。
核心原理:物理层负责2.4GHz ISM频段的射频收发,采用跳频扩频技术(每秒1600跳)抗干扰。基带层管理数据包的组装、拆解、差错校验和重传机制。链路管理层负责建立、维护和释放物理链路,包括查询、寻呼、连接状态机。L2CAP层向上层提供逻辑通道复用,支持数据包的分段与重组。RFCOMM层则仿真RS-232串口信号,使传统串口应用无需修改即可通过蓝牙传输数据——这正是SPP(串口透传)的协议基础。
| 协议层 | 主要功能 | 对小车项目的意义 |
|---|---|---|
| RF/基带 | 射频收发、跳频、数据包处理 | 决定通信距离与抗干扰能力 |
| 链路管理 (LM) | 连接建立、鉴权、加密 | 影响配对速度与连接稳定性 |
| L2CAP | 逻辑通道复用、数据分包 | 支持多路数据并发(如音频+控制) |
| RFCOMM/SPP | 串口仿真、流控 | 让MCU通过UART直接收发蓝牙数据 |
| 应用层 | 自定义协议、控制逻辑 | 小车指令解析、传感器数据上报 |
判断方法:当遇到蓝牙连接不稳定时,首先判断是物理层问题(距离过远、障碍物遮挡)还是链路层问题(配对失败、加密不匹配)。若手机能搜索到设备但无法连接,通常为链路管理层的PIN码或服务发现问题;若连接后数据丢包严重,则需检查基带层的重传机制是否被干扰,或应用层发送频率是否过高。
AT+UART=115200,0,0 修改波特率后,必须重新上电生效。若修改后无法通信,可按住模块上的按键上电进入AT模式恢复默认设置。
2.2 经典蓝牙与BLE:按需选择的双轨制
经典蓝牙(BR/EDR)与低功耗蓝牙(BLE)是蓝牙标准的两大分支。经典蓝牙从蓝牙2.0时代发展而来,支持更高的数据速率(最高3Mbps)和面向连接的同步语音传输(SCO),适合音频耳机、蓝牙音箱等场景。BLE从蓝牙4.0开始引入,设计目标为极低功耗、快速连接和广播模式,适合传感器节点、智能家居等电池供电设备。
核心差异对比:
| 对比维度 | 经典蓝牙 (BR/EDR) | BLE (低功耗蓝牙) |
|---|---|---|
| 传输速率 | 1-3 Mbps | 125 Kbps - 2 Mbps |
| 峰值功耗 | 约 30-100 mA | 约 5-15 mA |
| 连接建立时间 | 约 100 ms | 约 3-10 ms |
| 数据模式 | 面向连接,持续传输 | 广播 + 连接,支持休眠唤醒 |
| 典型应用 | 音频流、文件传输、SPP透传 | 传感器数据、Beacon、遥控器 |
| 手机兼容性 | 所有智能手机均支持 | iOS 7+ / Android 4.3+ 支持 |
判断方法:对于小车控制项目,若使用HC-05/HC-06模块,必须选择经典蓝牙,因为SPP服务仅在经典蓝牙中定义。若使用BLE模块(如HM-10、CC2541),则手机端需开发GATT服务,通过读写特征值实现数据交互,开发复杂度更高但功耗更低。若项目要求小车长时间待机且仅需周期性传输传感器数据,BLE是更优选择;若需要实时、高频的控制指令(如PWM调速、方向切换),经典蓝牙的SPP透传延迟更低且实现简单。
2.3 串口透传原理:UART与蓝牙的无缝桥接
串口透传(SPP)是蓝牙模块最常用的工作模式。其本质是将蓝牙无线链路抽象为一条虚拟串口线:MCU通过UART接口向模块发送数据,模块将数据封装为蓝牙协议包并通过射频发送;对端设备(如手机)接收到数据后,通过SPP服务将数据还原为字节流,反之亦然。这种设计让开发者无需关心蓝牙协议细节,只需像操作普通串口一样读写数据。
数据流处理流程:
- MCU通过UART TX引脚发送字节流(如0x01表示前进指令)。
- HC-05模块的UART接收缓冲区暂存数据,并添加蓝牙基带帧头、CRC校验等。
- 模块通过2.4GHz射频将数据包发送至已配对的手机。
- 手机端蓝牙协议栈解析数据包,通过RFCOMM层还原为字节流,交给APP的Socket接口。
- APP读取数据并执行相应动作(如更新UI、发送响应)。
关键参数配置:串口透传的波特率、数据位、停止位、校验位必须与MCU端UART配置一致。HC-05默认波特率为9600,8数据位,无校验,1停止位。若MCU端使用115200,需通过AT指令修改模块参数。此外,模块的流控(RTS/CTS)默认关闭,若开启需额外接线。
// STM32 UART初始化示例 (使用CubeMX生成的代码片段)
UART_HandleTypeDef huart2;
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600; // 与HC-05默认波特率一致
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
HAL_UART_Init(&huart2);
0xAA 0x55 0x02 0x1E 0x00 0x2B(帧头+长度+数据+校验)。手机APP接收后解析出距离值30cm并显示。若使用HC-05,APP端需建立蓝牙Socket连接,读取输入流即可获得原始字节。整个过程无需处理蓝牙协议细节,仅需关注应用层帧格式。
2.4 HC-05与HC-06模块:选型、配置与实战对比
HC-05和HC-06是市面上最常用的两款经典蓝牙SPP模块,均基于CSR BC417芯片,但固件和硬件设计存在差异。HC-05支持主从一体模式,可通过AT指令切换角色,适合需要模块主动连接其他蓝牙设备的场景(如连接蓝牙音箱)。HC-06仅支持从机模式,只能被手机或主机连接,适合小车、传感器等被动接收数据的设备。
模块对比表:
| 特性 | HC-05 | HC-06 |
|---|---|---|
| 主从模式 | 主/从可切换 | 仅从机 |
| AT指令集 | 完整(含角色、配对、绑定) | 有限(仅名称、波特率、密码) |
| 默认配对码 | 1234 | 1234 |
| 工作电压 | 3.6-6V(板载3.3V LDO) | 3.6-6V(板载3.3V LDO) |
| 指示灯状态 | 快闪=AT模式/未连接,慢闪=已连接 | 快闪=未连接,慢闪=已连接 |
| 典型价格 | 约 15-25 元 | 约 10-18 元 |
| 适用场景 | 需要主从互连、复杂配置 | 简单从机透传、低成本项目 |
AT指令配置方法:HC-05进入AT模式需按住模块上的按键再上电,此时模块以38400波特率工作(部分版本为9600)。HC-06则直接上电即为AT模式,但仅支持部分指令。常用AT指令如下:
AT+NAME=Car_Control // 修改蓝牙名称
AT+UART=115200,0,0 // 设置波特率115200, 8N1
AT+ROLE=1 // HC-05设为从机模式 (0=从机, 1=主机)
AT+PSWD=8888 // 修改配对码
AT+RESET // 复位模块使配置生效
案例拆解:某学生项目需要实现手机控制小车,但发现HC-05与手机配对后,发送指令小车无响应。排查过程如下:
- 初始现象:手机蓝牙能搜索到"HC-05"并配对成功,但APP发送数据后小车无动作。
- 关键参数检查:使用USB转TTL工具连接HC-05的TXD/RXD,发送AT指令查询模块状态,返回
OK。检查波特率设置为9600,与STM32一致。 - 分析判断:怀疑APP发送的数据格式与MCU解析逻辑不匹配。使用串口助手监听HC-05的TXD引脚,发现APP发送的十六进制数据为
0x01 0x00 0x00,而MCU代码中仅判断0x01作为前进指令,未处理后续字节。 - 实际操作:修改MCU代码,增加帧头校验(如0xAA开头)和长度字段,忽略无效数据。同时调整APP发送协议,统一为
0xAA 0x01 0x00 0x00 0xAB格式。 - 结果对比:修改后小车响应正常,且误触发概率显著降低。复盘发现,问题根源在于APP端使用了第三方蓝牙串口库,默认发送带换行符的ASCII字符串,而非原始十六进制字节。