4.5 字符串描述符

字符串描述符用于提供设备、配置或接口的文本信息(如厂商名称、产品序列号等),采用 Unicode 编码。它是可选的,若未提供,其他描述符中的字符串索引字段(如 iManufacturer)应设为 0

字符串描述符类型

  1. 语言 ID 描述符
    • 主机首次请求字符串描述符时(索引 0),设备返回支持的语言列表。
  2. 具体字符串描述符
    • 主机根据语言 ID 请求特定索引的字符串(如产品名、厂商名)。

1. 语言 ID 描述符结构

偏移量 大小 描述
0 bLength 1 数字 描述符总长度(N + 2N 为语言 ID 数量 × 2)。
1 bDescriptorType 1 常量 描述符类型(固定为 0x03)。
2 wLANGID[0..N] 2 数字 支持的语言 ID 数组(如 0x0409 表示英语)。

示例

| 字段               | 值(十六进制) | 说明                     |
|--------------------|----------------|--------------------------|
| `bLength`          | `0x04`         | 总长度 4 字节(1 种语言)。|
| `bDescriptorType`  | `0x03`         | 字符串描述符类型。         |
| `wLANGID[0]`       | `0x0409`       | 英语(美国)。             |

2. Unicode 字符串描述符结构

偏移量 大小 描述
0 bLength 1 数字 描述符总长度(Unicode 字符串字节数 + 2)。
1 bDescriptorType 1 常量 描述符类型(固定为 0x03)。
2 bString N Unicode 字符串内容(每个字符占 2 字节,以 \0 结尾)。

示例:厂商名称 “ABC Corp” 的字符串描述符

| 字段               | 值(十六进制)       | 说明                     |
|--------------------|----------------------|--------------------------|
| `bLength`          | `0x12`               | 总长度 18 字节(8字符×2 + 2)。 |
| `bDescriptorType`  | `0x03`               | 字符串描述符类型。         |
| `bString`          | `0041 0042 0043 0020 0043 006F 0072 0070` | "A B C   C o r p"(Unicode) |

关键说明

  1. 获取流程

    • 步骤 1:主机请求索引 0 的字符串描述符,获取语言 ID 列表。
      bmRequestType = 0x80, bRequest = 0x06, wValue = (0x03<<8)|0x00, wIndex = 0x0000
    • 步骤 2:主机选择语言(如 0x0409),请求具体字符串(如索引 1 的厂商名)。
      bmRequestType = 0x80, bRequest = 0x06, wValue = (0x03<<8)|0x01, wIndex = 0x0409
  2. 常见语言 ID

语言 ID(十六进制) 语言
0x0409 英语(美国)
0x0404 中文(繁体)
0x0804 中文(简体)
  1. 特殊值
    • iManufacturer/iProduct 等字段为 0,表示无对应字符串描述符。

实际应用示例

设备描述符片段

| 字段               | 值(十六进制) | 说明                     |
|--------------------|----------------|--------------------------|
| `iManufacturer`    | `0x01`         | 厂商名索引为 1。          |
| `iProduct`         | `0x02`         | 产品名索引为 2。          |
| `iSerialNumber`    | `0x00`         | 无序列号字符串。          |

主机请求流程

  1. 获取语言 ID:wValue = 0x0300 → 返回 0x0409(英语)。
  2. 获取厂商名:wValue = 0x0301, wIndex = 0x0409 → 返回 “ABC Corp”。