不能有一个零长度的 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 版本上运行。