我正在开发一个 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 版本上工作。