HID协议

文章目录

    • [🧩 一、HID协议的基本概念](#🧩 一、HID协议的基本概念)
      • [1. **什么是 HID?**](#1. 什么是 HID?)
    • [🧱 二、HID 协议结构与组成](#🧱 二、HID 协议结构与组成)
      • [1. **描述符(Descriptor)系统**](#1. 描述符(Descriptor)系统)
      • [2. **报告(Report)类型**](#2. 报告(Report)类型)
    • [📡 三、通信过程(以 USB 为例)](#📡 三、通信过程(以 USB 为例))
      • [USB HID设备的典型枚举流程:](#USB HID设备的典型枚举流程:)
    • [🖱️ 四、HID 示例:USB 鼠标](#🖱️ 四、HID 示例:USB 鼠标)
    • [🔄 五、HID 报文的传输方式](#🔄 五、HID 报文的传输方式)
      • [USB中断传输(Interrupt Transfer):](#USB中断传输(Interrupt Transfer):)
    • [🔒 六、HID 的优点](#🔒 六、HID 的优点)
    • [🔧 七、HID 自定义设备](#🔧 七、HID 自定义设备)
    • [📚 八、HID 与其他协议对比](#📚 八、HID 与其他协议对比)
    • [✅ 总结](#✅ 总结)

HID(Human Interface Device,人机接口设备)协议是一种用于描述人类与计算机之间交互设备(如鼠标、键盘、游戏手柄、触摸板等)通信的协议标准。它最初由 USB-IF(USB Implementers Forum)定义,用于 USB 接口,但后来也被应用于 Bluetooth、I2C、SPI 等其他总线中。


🧩 一、HID协议的基本概念

1. 什么是 HID?

  • 是一种设备类协议(而不是某一具体的设备或硬件接口),归属于 USB 协议族中的一种。
  • 目的是使主机能够识别不同种类的人机交互设备,并以统一方式与之通信。

🧱 二、HID 协议结构与组成

HID 设备使用 Report(报文) 作为数据交换的最小单位,通过**描述符(Descriptor)**告诉主机如何解释这些数据。

1. 描述符(Descriptor)系统

HID 协议通过多个层级的描述符,来告诉主机:

  • 我是谁(设备信息)
  • 我有什么功能(报告结构)
  • 数据是如何组织的

主要描述符:

描述符类型 作用
Device Descriptor USB设备的基本信息(VID、PID、版本号)
Configuration Descriptor USB设备的配置信息
Interface Descriptor 描述该设备的一个接口
HID Descriptor 说明该接口是 HID 类型,并指定报告描述符的位置
Report Descriptor(重点) 描述数据的格式与含义,例如鼠标坐标、按钮状态

Report Descriptor 是 HID 的核心,它定义了设备发送的数据的结构,而不是数据本身。


2. 报告(Report)类型

HID 数据以 Report(报告) 的形式传输,分为三类:

类型 用途
Input Report 设备 → 主机,如鼠标移动、键盘按键
Output Report 主机 → 设备,如键盘灯状态
Feature Report 配置类信息,主机和设备都可发起

📡 三、通信过程(以 USB 为例)

USB HID设备的典型枚举流程:

  1. 设备插入 → 主机通过控制传输读取描述符。
  2. 主机读取 HID 描述符和 Report 描述符
  3. 主机理解数据结构(例如:鼠标的 X、Y、按键)。
  4. 建立中断传输通道(Interrupt Transfer)进行周期性通信。
  5. 持续传输数据:如鼠标报告当前位置、键盘报告按键值。

🖱️ 四、HID 示例:USB 鼠标

Report Descriptor 示例(简化):

c 复制代码
0x05, 0x01,        // Usage Page (Generic Desktop)
0x09, 0x02,        // Usage (Mouse)
0xA1, 0x01,        // Collection (Application)
  0x09, 0x01,      //   Usage (Pointer)
  0xA1, 0x00,      //   Collection (Physical)
    0x05, 0x09,    //     Usage Page (Buttons)
    0x19, 0x01,    //     Usage Minimum (Button 1)
    0x29, 0x03,    //     Usage Maximum (Button 3)
    0x15, 0x00,    //     Logical Minimum (0)
    0x25, 0x01,    //     Logical Maximum (1)
    0x95, 0x03,    //     Report Count (3)
    0x75, 0x01,    //     Report Size (1)
    0x81, 0x02,    //     Input (Data, Variable, Absolute)
    ...
  • 表示:设备是鼠标,有3个按钮,有X、Y方向的坐标数据。

  • 报文示例:[0x00, 0x03, 0xFA]

    • 第一个字节代表按键状态(如 Bit0=左键)
    • 后两个字节是 X、Y 坐标的偏移

🔄 五、HID 报文的传输方式

USB中断传输(Interrupt Transfer):

  • HID 设备不会占用总线,只在数据变化时发送。
  • 鼠标、键盘等周期性发送数据(每 10ms 一次)
  • 数据传输不大,但传输延迟低,实时性强。

🔒 六、HID 的优点

  • 📦 无需驱动:多数系统内置了 HID 驱动,免去了驱动开发。
  • 🎮 适用广泛:支持鼠标、键盘、游戏手柄等。
  • 🔧 高度可配置:通过报告描述符,自定义复杂数据结构。
  • 🌐 跨平台支持好:Windows、Linux、MacOS、安卓等都支持。

🔧 七、HID 自定义设备

你也可以开发一个自定义的 HID 设备(如测量仪表、遥控器),只需:

  • 编写符合 HID 报告描述符的描述结构
  • 将采集到的数据填入报告中发送给主机
  • 主机端使用通用 HID 接口读取数据(如 libhidhidrawhidapi

📚 八、HID 与其他协议对比

特性 HID CDC(串口) MSC(大容量存储)
驱动支持 操作系统原生支持 一般需安装驱动 操作系统原生支持
通信模式 中断传输 流式传输 块传输
实时性
应用场景 键盘、鼠标等 串口调试工具等 U盘、存储设备

✅ 总结

HID 协议是一种成熟、灵活、无需额外驱动的人机接口协议,支持丰富设备类型。其核心在于 描述符 + 报告结构,设备和主机基于这个定义进行双向通信。

如果你是嵌入式开发者,想实现一个自定义 HID 外设(如触摸笔、遥控器),只需要掌握:

  • HID Report Descriptor 的编写方法
  • 正确组织数据并通过中断发送
  • 主机端可以用 hidapi、WinUSB、Linux hidraw 等读取

相关推荐
你的强来了9981 天前
RAWINPUT避坑指南(涉及GetRawInputData/GetRawInputBuffer)
hid·rawinput·键鼠监听
WPG大大通18 天前
TBT 5、TBT 4 和 USB4 的差异概述
经验分享·笔记·电脑·显示器·usb·充电
Uncertainty!!23 天前
OpenEuler操作系统中检测插入的USB设备并自动挂载
linux·usb·openeuler·mount·u盘·自动挂载
叶余2 个月前
USB Gadget设备软插拔异常的处理方法
usb·gadget
叶余2 个月前
USB Gadget设备枚举失败的处理方法
usb·hid·gadget
叶余2 个月前
USBIP技术简介
usb·usbip
叶余2 个月前
USB工程应用基础概念简介
usb
gis分享者2 个月前
学习threejs,使用TSL计算粒子鼠标特效
threejs·鼠标·粒子·tsl·raycaster
zgyrelax_zgykill2 个月前
USB子系统和type-c接口快速理解
usb·typec