将Microsoft提供的 USB 驱动程序(Usbser.sys)用于通信和通信设备类(CDC)控制设备。 尽可能使用 Windows 附带的驱动程序。
重要
本文适用于 CDC 控制设备的制造商。 如果你的客户遇到 USB 问题,请参阅 修复 Windows 中的 USB-C 问题
Usbser.sys 是使用 Kernel-Mode Driver Framework 实现的。 驱动程序支持即插即用以及 USB 选择性挂起等电源管理功能。
通用 Windows 平台(UWP)应用程序可以使用 Windows.Devices.SerialCommunication 命名空间提供的 API,使应用能够与 CDC 设备通信。
Usbser.sys 安装
加载用于通信和 CDC 控制设备的 Microsoft 提供的内置驱动程序 (Usbser.sys)。
注意
如果尝试安装 Windows 中包含的 USB 设备类驱动程序,则无需下载驱动程序。 Windows 会自动安装这些驱动程序。 如果 Windows 未安装驱动程序,请联系设备制造商。 有关 Windows 中包含的 USB 设备类驱动程序的列表,请参阅 Windows 中包含的 USB 设备类驱动程序。
Usbser.inf 位于 %Systemroot%\INF
目录中。 此设置信息(INF)文件 将Usbser.sys 作为设备堆栈中的功能设备对象(FDO)加载。 如果设备属于通信和 CDC 控制设备类, Usbser.sys 自动加载。 无需编写自己的 INF 文件来引用驱动程序。 Windows 基于兼容的 ID 匹配加载驱动程序,类似于 Windows 中包含的其他 USB 设备类驱动程序。
USB\Class_02
USB\Class_02&SubClass_02
若要自动加载 Usbser.sys ,请将类代码设置为 02,并将 设备描述符中的子类代码设置为 02。 使用此方法时,无需为设备分发 INF 文件,因为系统使用 Usbser.inf。 有关详细信息,请参阅通信设备的类定义 1.2。
如果设备指定类代码 02,但非 02 的子类代码, 则Usbser.sys 不会自动加载。 即插即用管理器试图找到驱动程序。 如果 Windows 找不到合适的驱动程序,则设备可能未加载驱动程序。 可能需要加载自己的驱动程序或编写引用另一个内置驱动程序的 INF 文件。
如果你的设备指定了 02 的类和子类代码,并且你想要加载另一个驱动程序而不是 Usbser.sys,请编写 INF 文件。 在 INF 文件中,指定要安装的设备的硬件 ID 和驱动程序。
为 Usbser.sys 配置选择性挂起
Usbser.sys 支持 USB 选择性挂起。 此驱动程序允许附加的 USB 到串行设备在不使用时进入低功率状态,而系统保持 S0 状态。 与设备通信恢复时,设备将保持暂停状态并恢复工作状态。 此功能默认处于禁用状态,但可以通过设置此注册表项下的 IdleUsbSelectiveSuspendPolicy 条目来启用和配置此功能:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\<hardware id>\<instance id>\Device Parameters
若要配置 Usbser.sys电源管理功能,请将 IdleUsbSelectiveSuspendPolicy 参数设置为:
价值 | 行为 |
---|---|
0x00000001 |
在空闲时进入选择性暂停状态,即设备没有活跃的数据传输时的状态。 |
0x00000000 |
仅当设备没有打开句柄时,才输入选择性挂起。 |
以以下两种方式之一添加该条目:
编写一个引用安装 INF 的 INF,并在“HW.AddReg”部分添加注册表项。
在扩展属性 OS 功能描述符中描述该注册表项。 添加一个自定义属性节,该节将 bPropertyName 字段设置为 Unicode 字符串:
IdleUsbSelectiveSuspendPolicy
。 将 wPropertyNameLength 设置为 62 字节。 将 bPropertyData 字段设置为0x00000001
或0x00000000
. 属性值存储为小端序 32 位整数。有关详细信息,请参阅 Microsoft OS 描述符。
为 USB CDC 设备开发 Windows 应用程序
Windows 应用使用 Windows.Devices.SerialCommunication 命名空间将请求发送到 Usbser.sys。 命名空间定义通过串行端口或串行端口抽象与 USB CDC 设备通信的 Windows 运行时类。 这些类允许你发现串行设备、读取和写入数据,以及控制流控制的特定串行属性,例如设置波特率和信号状态。