4.5 字符串描述符
字符串描述符用于提供设备、配置或接口的文本信息(如厂商名称、产品序列号等),采用 Unicode 编码。它是可选的,若未提供,其他描述符中的字符串索引字段(如 iManufacturer
)应设为 0
。
字符串描述符类型
- 语言 ID 描述符
- 主机首次请求字符串描述符时(索引
0
),设备返回支持的语言列表。
- 主机首次请求字符串描述符时(索引
- 具体字符串描述符
- 主机根据语言 ID 请求特定索引的字符串(如产品名、厂商名)。
1. 语言 ID 描述符结构
偏移量 | 域 | 大小 | 值 | 描述 |
---|---|---|---|---|
0 | bLength |
1 | 数字 | 描述符总长度(N + 2 ,N 为语言 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:主机请求索引
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
- 步骤 1:主机请求索引
常见语言 ID
语言 ID(十六进制) | 语言 |
---|---|
0x0409 |
英语(美国) |
0x0404 |
中文(繁体) |
0x0804 |
中文(简体) |
- 特殊值
- 若
iManufacturer
/iProduct
等字段为0
,表示无对应字符串描述符。
- 若
实际应用示例
设备描述符片段
| 字段 | 值(十六进制) | 说明 |
|--------------------|----------------|--------------------------|
| `iManufacturer` | `0x01` | 厂商名索引为 1。 |
| `iProduct` | `0x02` | 产品名索引为 2。 |
| `iSerialNumber` | `0x00` | 无序列号字符串。 |
主机请求流程
- 获取语言 ID:
wValue = 0x0300
→ 返回0x0409
(英语)。 - 获取厂商名:
wValue = 0x0301, wIndex = 0x0409
→ 返回 “ABC Corp”。