当前位置: 首页 > news >正文

【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 Command0x01主机→控制器,由蓝牙协议栈发送给芯片的命令,发送控制命令(如 HCI_RESET)
HCI ACL Data0x02双向,蓝牙协议栈跟蓝牙芯片双向交互的普通数据,传输普通数据(如 BLE 连接数据)
HCI Synchronous Data (SCO)0x03双向,蓝牙芯片跟蓝牙协议栈双向交互的通话/语音识别等音频数据,传输实时音频(如传统语音通话)
HCI Event0x04控制器→主机,由蓝牙芯片上报给蓝牙协议栈的事件,上报事件(如命令完成、状态变化)
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 成为资源受限场景(如嵌入式设备)的首选传输方案。

http://www.dtcms.com/a/312997.html

相关文章:

  • wordpress登陆前登陆后显示不同的顶部菜单
  • 前后端交流
  • Go语言声明变量
  • mybatis实现固定三层树形结构的嵌套查询
  • 怎么修改论文格式呢?提供一份论文格式模板
  • 【ProtoBuf】初识ProtoBuf
  • 【UE5医学影像可视化】读取本地Dicom生成VolumeTexture,实现2D显示和自动翻页
  • 关于记录一下“bug”,在做图片上传的时候出现的小问题
  • B3953 [GESP202403 一级] 找因数
  • 大模型智能体(Agent)技术全景:架构演进、协作范式与应用前沿
  • Python Dash 全面讲解
  • 使用 Vuepress + GitHub Pages 搭建项目文档
  • io_getevents系统调用及示例
  • Android 之 图片加载(Fresco/Picasso/Glide)
  • 第四章:OSPF 协议
  • Docker环境离线安卓安装指南
  • Android 之 存储(Assets目录,SharedPreferences,数据库,内部存储等)
  • 音视频学习(五十):音频无损压缩
  • 使用 Docker 部署 Golang 程序
  • 计数组合学7.12( RSK算法的一些推论)
  • 考研复习-计算机组成原理-第二章-数据的表示和运算
  • PHP面向对象编程与数据库操作完全指南-下
  • 深入解析C++函数重载:从原理到实践
  • 2025年测绘程序设计比赛--基于统计滤波的点云去噪(已获国特)
  • MySQL梳理三:查询与优化
  • python新功能match case|:=|typing
  • Hertzbeat如何配置redis?保存在redis的数据是可读数据
  • 【MySQL安全】什么是SQL注入,怎么避免这种攻击:前端防护、后端orm框架、数据库白名单
  • Android设备认证体系深度解析:GMS/CTS/GTS/VTS/STS核心差异与认证逻辑
  • ELECTRICAL靶机复现练习笔记