不能有零长度的 USB“串行”字符串描述符?

问题描述 投票:0回答:2

我正在开发一个 USB 硬件项目,希望用户能够更改设备序列号。这通过“USB 字符串描述符”3.

报告给系统

我发现,如果序列号长度为零(因此有 32 个字节的空值),则该设备甚至不会在 (Windows) 设备管理器中显示。然而,当它具有非零数量的(unicode)字符后跟空值时,它工作得很好。

有什么特殊原因导致这种情况吗?

windows usb
2个回答
1
投票

序列号作为对主机控制传输请求的响应而传输,具有字符串描述符的格式,如下所示:

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 版本上工作。


0
投票

有什么特殊原因导致这种情况吗?

我遇到了同样的问题。该设备在 Linux 上工作正常,但在 Windows 上无法枚举。

使用 USB 分析器监控总线,发现在收到包含 12 个 unicode 字符且值为 0 的序列号后,Windows 立即开始重置端口:

USB packet capture

我在 USB 规范中找不到与此相关的任何具体要求,但字符串描述符被指定为由 Unicode 字符组成。不过,空字符索引应该是有效的 Unicode 字符。

另一方面,如果描述符标头指定长度为 0 个字符,则 Windows 接受序列号。

© www.soinside.com 2019 - 2024. All rights reserved.