不能有一个零长度的 USB "serial" 字符串描述符?
Cannot have a zero-length USB "serial" string descriptor?
我正在从事 USB 硬件项目,希望用户能够更改设备序列号。这是通过“USB 字符串描述符”3.
报告给系统的
我发现如果序列长度为零(因此有 32 个字节的空值),设备 甚至不会出现 在 (Windows)装置经理。而当它有一个非零数量的(unicode)字符后跟空值时,它工作正常。
为什么会出现这种情况有什么特别的原因吗?
序列号是作为对来自主机的控制传输请求的响应而传输的,具有字符串描述符的格式,如下所示:
Offset Field Size Description
0 bLength 1 Size of descriptor (in bytes)
1 bDescriptorType 1 String descriptor type (0x03)
2 bString n Unicode encoded string (in UTF-16)
字符串描述符的长度可变。从偏移量 2 开始的 bString 字段只要需要即可。该字符串不是以 null 结尾的。
字符串描述符以及空字符串的控制传输响应如下所示:
0x02 0x03
无论如何,序列号为空或缺失都不是好主意。大多数操作系统使用 VID、PID 和序列号的组合来唯一标识 USB 设备。在 Windows 上,它甚至是驱动程序安装的基础,尽管 Windows 有一些技巧来处理丢失的序列号。
听说固定长度的字符串在 Windows 上起作用,有点令人惊讶。您不能假设它可以在其他操作系统上运行,甚至可以在未来的 Windows 版本上运行。
我正在从事 USB 硬件项目,希望用户能够更改设备序列号。这是通过“USB 字符串描述符”3.
报告给系统的我发现如果序列长度为零(因此有 32 个字节的空值),设备 甚至不会出现 在 (Windows)装置经理。而当它有一个非零数量的(unicode)字符后跟空值时,它工作正常。
为什么会出现这种情况有什么特别的原因吗?
序列号是作为对来自主机的控制传输请求的响应而传输的,具有字符串描述符的格式,如下所示:
Offset Field Size Description
0 bLength 1 Size of descriptor (in bytes)
1 bDescriptorType 1 String descriptor type (0x03)
2 bString n Unicode encoded string (in UTF-16)
字符串描述符的长度可变。从偏移量 2 开始的 bString 字段只要需要即可。该字符串不是以 null 结尾的。
字符串描述符以及空字符串的控制传输响应如下所示:
0x02 0x03
无论如何,序列号为空或缺失都不是好主意。大多数操作系统使用 VID、PID 和序列号的组合来唯一标识 USB 设备。在 Windows 上,它甚至是驱动程序安装的基础,尽管 Windows 有一些技巧来处理丢失的序列号。
听说固定长度的字符串在 Windows 上起作用,有点令人惊讶。您不能假设它可以在其他操作系统上运行,甚至可以在未来的 Windows 版本上运行。