USB 串行驱动程序 (Usbser.sys)

重要

本主题是面向程序员的。 如果你是遇到 USB 问题的客户,请参阅修复 Windows 中的 USB-C 问题

为通信和 CDC 控制设备使用 Microsoft 提供的 USB 驱动程序 (Usbser.sys)。 Microsoft 鼓励你尽可能使用 Windows 附带的驱动程序。

支持的版本

  • Windows 11
  • Windows 10

适用于

  • CDC 控制设备的设备制造商

在 Windows 10 中,使用内核模式驱动程序框架重写了驱动程序,从而提高了驱动程序的整体稳定性。

  • 驱动程序改进了即插即用和电源管理。
  • 添加了电源管理功能,如 USB 选择性挂起

此外,UWP 应用程序现在可以使用 Windows.Devices.SerialCommunication 命名空间提供的 API,这些 API 允许应用与这些设备通信。

Usbser.sys 安装

加载用于通信和 CDC 控制设备的 Microsoft 提供的内置驱动程序 (Usbser.sys)。

注意

如果你尝试安装 Windows 中包含的 USB 设备类驱动程序,则不需要下载该驱动程序。 它们将自动进行安装。 如果未自动安装,请与设备制造商联系。 有关包含在 Windows 中的 USB 设备类驱动程序的列表,请参见包含在 Windows 中的 USB 设备类驱动程序

从 Windows 10 开始,Usbser.inf 已添加到 %Systemroot%\INF 目录中,该目录将 Usbser.sys 作为设备堆栈中的功能设备对象 (FDO) 加载。 如果你的设备属于通信和 CDC 控制设备类,则 Usbser.sys 将自动加载。 不需要编写自己的 INF 来引用驱动程序。 驱动程序是基于与包含在 Windows 中的其他 USB 设备类驱动程序相似的兼容 ID 匹配来加载的。

USB\Class_02

USB\Class_02&SubClass_02

  • 如果要自动加载 Usbser.sys,请在设备描述符中将类代码设置为 02,将子类代码设置为 02。 通过这种方法,你不需要为设备分发 INF 文件,因为系统使用 Usbser.inf。 有关详细信息,请参阅通信设备的类定义 1.2

  • 如果设备指定了类代码 02,但子类代码值不是 02,则 Usbser.sys 不会自动加载。 即插即用管理器试图找到驱动程序。 如果找不到合适的驱动程序,则设备可能没有加载驱动程序。 可能需要加载自己的驱动程序,或者编写一个引用另一个内置驱动程序的 INF。

  • 如果你的设备将类和子类代码指定为 02,并且你想要加载另一个驱动程序而不是 Usbser.sys,则必须编写一个 INF,指定要安装的设备和驱动程序的硬件 ID。 例如,查看示例驱动程序中包含的 INF 文件,并查找与你的设备类似的设备。 有关 INF 部分的信息,请参阅 INF 文件概述

为 Usbser.sys 配置选择性挂起

从 Windows 10 开始,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 10 开始,Windows 应用可以使用 Windows.Devices.SerialCommunication 命名空间向 Usbser.sys 发送请求。 它定义了 Windows 运行时类,这些类可用于通过串行端口或某个串行端口抽象与 USB CDC 设备通信。 这些类提供了发现此类串行设备、读写数据和控制流控制的串行特定属性(如设置波特率、信号状态)的功能。