【Bluetooth】【Transport层篇】第四章 基于基础UART的蓝牙硬件发送协议 UART H4 Transport详解

一、UART H4 Transport 简介

蓝牙 Transport 是主机(Host,蓝牙协议栈)与控制器(Controller,蓝牙芯片)之间的硬件层通信协议,负责承载 HCI(Host Controller Interface)数据。

蓝牙 Transport 就是蓝牙的硬件发送协议,硬件的传输介质有:UART/USB/SDIO,如果有读者有一些嵌入式知识基础的话,这些通信方式就没有那么陌生了,那么Transport 就是在特定的硬件传输介质上增加了一些协议。

比如:H4就是在UART上增加了一个小协议,H4算是最简单的一个协议,只是在数据前面加一个Type(类型标识),了解过蓝牙HCI一般都会知道蓝牙协议栈(Host)芯片(Controller) 一般是通过硬件传输介质 传输HCI数据来沟通,那么H4就是在HCI数据前面加上一个TYPE。

简而言之,H4 是 UART 介质上的轻量实现:仅在 HCI 原始数据前附加 1 字节类型标识,用于区分 HCI 数据包的类别,是连接 "协议逻辑" 与 "硬件传输" 的桥梁。

二、H4 协议格式与数据包类型

H4 的传输格式为 "类型前缀 + HCI 原始数据",结构如下:

plaintext

复制代码
| 1 Byte (H4 Type) | N Bytes (HCI Raw Data) |

根据蓝牙 Core 规范,H4 定义了 5 种类型(对应不同 HCI 数据包):

HCI 数据包类型 Type 值 方向与用途
HCI Command 0x01 主机→控制器,由蓝牙协议栈发送给芯片的命令,发送控制命令(如 HCI_RESET)
HCI ACL Data 0x02 双向,蓝牙协议栈跟蓝牙芯片双向交互的普通数据,传输普通数据(如 BLE 连接数据)
HCI Synchronous Data (SCO) 0x03 双向,蓝牙芯片跟蓝牙协议栈双向交互的通话/语音识别等音频数据,传输实时音频(如传统语音通话)
HCI Event 0x04 控制器→主机,由蓝牙芯片上报给蓝牙协议栈的事件,上报事件(如命令完成、状态变化)
HCI ISO Data(Core 5.2+) 0x05 双向,用于发送LE audio,传输 LE Audio 的 ISO 同步数据(这部分是在core5.2才添加)

三、代码实现:H4 数据发送流程(以 HCI_RESET 为例)

以下通过HCI_RESET 命令发送,解析 H4 的核心逻辑:

3.1 缓冲区分配

H4 需要额外 1 字节存储 Type,因此缓冲区长度 = HCI 原始数据长度 + 1

复制代码
// BT_TRANSPORT_TYPE=0x02 表示H4模式
struct bt_pbuf_t *p = bt_pbuf_alloc(BT_TRANSPORT_TYPE, HCI_RESET_PLEN + 1, BT_PBUF_RAM);

3.2 组装 HCI 原始数据

通过hci_cmd_ass函数构建 HCI 命令的 opcode、参数(如 HCI_RESET 的原始数据为0x03 0x0c 0x00)。

3.3 插入 H4 Type

  • 先通过bt_pbuf_header将缓冲区头部后移 1 字节,预留 Type 空间;

  • 再填充类型(命令类型对应0x01):

    bt_pbuf_header(p, 1); // 头部后移1字节,腾出Type位置
    ((uint8_t *)p->payload)[0] = PHYBUSIF_PACKET_TYPE_CMD; // 写入Type=0x01

3.4 UART 发送

将 "Type + HCI 数据" 拷贝到 UART 发送缓冲区,最终通过uart_bt_send发送:

复制代码
uint8_t *tx_buffer = bt_get_tx_buffer();  
bt_pbuf_copy_partial(p, tx_buffer, p->tot_len, 0); // 拷贝完整数据包  
uart_bt_send(tx_buffer, p->tot_len); // UART发送  

四、UART 硬件配置要求

为保证 H4 通信稳定,UART 需严格配置:

配置项 参数值 说明
数据位 8 bit 标准 HCI 数据宽度
奇偶校验 无(No Parity) 避免校验位干扰
停止位 1 bit 最简同步方式
流控 硬件流控(RTS/CTS) 防止数据溢出(必选)

STM32 配置示例:

复制代码
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_RTS_CTS;  

Linux 配置示例(termios):

复制代码
toptions.c_cflag &= ~CSTOPB; // 1停止位  
toptions.c_cflag |= CS8;     // 8数据位  
toptions.c_cflag &= ~PARENB; // 无校验  
toptions.c_cflag |= CRTSCTS; // 使能硬件流控  

五、同步与纠错机制

UART 通信可能因噪声、波特率偏差等失步(如检测到无效 Type,或数据包长度异常),处理规则:

  1. 控制器→主机 失步

    控制器会上报 HCI Hardware Error 事件,主机需发送 HCI_RESET 命令 复位控制器,通过 "HCI Reset 命令完成事件" 重新同步。

  2. 主机→控制器 失步

    主机检测到失步后,发送 HCI_RESET 命令,控制器执行复位并恢复同步。

H4 通过 "1 字节 Type" 的极简设计,在 UART 上高效承载 HCI 数据;结合硬件流控和复位机制,保障了通信的可靠性。这种设计让 H4 成为资源受限场景(如嵌入式设备)的首选传输方案。

相关推荐
Molesidy1 小时前
【Bluetooth】【基础篇】第二章 关于蓝牙协议栈架构与其硬件方案架构大致概述
bluetooth·蓝牙通信协议
奔跑吧 android21 天前
【android bluetooth 协议分析 07】【SDP详解 2】【SDP 初始化】
android·bluetooth·aosp15·bt·gd·sdp_init
奔跑吧 android1 个月前
【android bluetooth 框架分析 04】【bt-framework 层详解 8】【DeviceProperties介绍】
sdp·properties·bluetooth·connect·aosp13·bond·startdiscovery
奔跑吧 android2 个月前
【android bluetooth 框架分析 04】【bt-framework 层详解 5】【AbstractionLayer介绍】
android·framework·bluetooth·bt·gd·aosp13
奔跑吧 android2 个月前
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
android·bluetooth·bt·aosp13
奔跑吧 android2 个月前
【android bluetooth 案例分析 04】【Carplay 详解 3】【Carplay 连接之车机主动连手机】
android·bluetooth·carplay·bt·gd·aosp13
奔跑吧 android2 个月前
【android bluetooth 案例分析 04】【Carplay 详解 2】【Carplay 连接之手机主动连车机】
android·bluetooth·carplay·bt·aosp13
MADAO_luv2 个月前
Android Studio里的BLE数据接收策略
android-studio·低功耗蓝牙·bluetooth
奔跑吧 android2 个月前
【android bluetooth 协议分析 02】【bluetooth hal 层详解 3】【高通蓝牙hal主要流程介绍-上】
android·bluetooth·qcom·bt_hal_1.0·qcom_bt·高通蓝牙hal