为 USB 设备开发 Windows 应用程序的概述

摘要:

  • 选择正确编程模型的准则
  • UWP 应用和桌面应用开发人员体验

重要的 API:

本文提供用于确定是应编写 UWP 应用还是 Windows 桌面应用来与 USB 设备通信的指南。

Windows 提供的 API 集可用于编写与自定义 USB 设备通信的应用。 该 API 执行与 USB 相关的常见任务,例如查找设备和数据传输。

此上下文中的自定义设备是指 Microsoft 不提供内置类驱动程序的设备。 可以改为安装 WinUSB (Winusb.sys) 作为设备驱动程序。

选择编程模型

如果安装 Winusb.sys,以下是编程模型选项:

选择最佳编程模型的策略取决于各种因素。

  • 应用会与内部 USB 设备通信吗?

    这些 API 主要是为访问外围设备而设计的。 该 API 还可以访问电脑内部的 USB 设备。 但是,从 UWP 应用访问电脑内部 USB 设备仅限于该电脑的 OEM 在设备元数据中显式声明的特权应用。

  • 应用会与 USB 常时等量终结点通信吗?

    如果应用与设备的常时等量终结点之间传入或传出数据,则必须编写一个 Windows 桌面应用。 在Windows 8.1中,新的 WinUSB Functions 已添加到 API 集中,该集允许桌面应用向常量终结点发送数据以及从常量终结点接收数据。

  • 应用是“控制面板”类型的应用吗?

    UWP 应用是每用户应用,无法在每个应用范围之外进行更改。 对于这些类型的应用,必须编写 Windows 桌面应用。

  • UWP 应用是否支持 USB 设备类?

    如果设备属于这些设备类之一,则请编写一个 UWP 应用。

    • name:cdcControl, classId:02 * *
    • name:physical, classId:05 * *
    • name:personalHealthcare, classId:0f 00 00
    • name:activeSync, classId:ef 01 01
    • name:palmSync, classId:ef 01 02
    • name:deviceFirmwareUpdate, classId:fe 01 01
    • name:irda, classId:fe 02 00
    • name:measurement, classId:fe 03 *
    • name:vendorSpecific, classId:ff * *

    注意

    如果设备属于 DeviceFirmwareUpdate 类,则应用必须是特权应用。

如果你的设备不属于上述设备类,请编写 Windows 桌面应用。

驱动程序要求

驱动程序要求 UWP 应用 Windows 桌面应用
函数驱动程序 Microsoft 提供的 Winusb.sys(内核模式驱动程序)。 Microsoft 提供的 Winusb.sys(内核模式驱动程序)。
筛选器驱动程序 如果存在筛选器驱动程序,则访问仅限于特权应用。 该应用由 OEM 在设备元数据中声明为特权应用。 只要筛选器驱动程序不阻止对 Winusb.sys 的访问,它就可以存在于内核模式的设备堆栈中。

代码示例

示例 UWP 应用 Windows 桌面应用
开始使用这些示例

开发工具

开发工具 UWP 应用 Windows 桌面应用
开发人员环境 Microsoft Visual Studio 2013

适用于 Windows 8.1 的 Microsoft Windows 软件开发工具包 (SDK)
使用 Visual Studio (Ultimate 或 Professional) 附带的 WinUSB 应用程序 模板和 Windows 驱动程序工具包 (WDK) 8 或更高版本。

对于常时等量传输,Visual Studio 2013 Windows 驱动程序工具包 (WDK) 8.1 或更高版本。
编程语言 C#、VB.NET、C++、JavaScript C/C++

功能实现

关键场景 UWP 应用 Windows 桌面应用
设备发现 使用 Windows.Devices.Enumeration 命名空间获取 UsbDevice 使用 SetupAPIWinUsb_Initialize 获取WINUSB_INTERFACE_HANDLE。
USB 控制传输 UsbSetupPacket
UsbControlRequestType
UsbDevice.SendControlInTransferAsync
UsbDevice.SendControlOutTransferAsync
WINUSB_SETUP_PACKET
WinUsb_ControlTransfer
获取 USB 描述符 UsbDevice.DeviceDescriptor
UsbConfiguration.Descriptors
UsbInterface.Descriptors
UsbEndpointDescriptor
WinUsb_GetDescriptor
发送 USB 批量传输 UsbBulkInPipe
UsbBulkInPipe
WinUsb_ReadPipe
WinUsb_ReadPipe
发送 USB 中断传输 UsbInterruptInPipe
UsbInterruptOutPipe
WinUsb_ReadPipe
WinUsb_ReadPipe
发送 USB 常时等量传输 不支持。 WinUsb_ReadIsochPipe
WinUsb_ReadIsochPipeAsap
WinUsb_WriteIsochPipe
WinUsb_WriteIsochPipeAsap
关闭设备 UsbDevice.Close WinUsb_Free

文档

文档 UWP 应用 Windows 桌面应用
编程指南 与 USB 设备通信,从开始到完成 如何通过 WinUSB Functions 访问 USB 设备
API 参考 Windows.Devices.Usb WinUSB 函数