總結:
- 選擇正確程序設計模型的指導方針
- UWP 應用程式和桌面應用程式開發人員體驗
重要 API:
本文提供指導方針,讓您決定是否應該撰寫 UWP 應用程式或 Windows 傳統型應用程式來與 USB 裝置通訊。
Windows 提供 API 集合,可讓您用來撰寫與自定義 USB 裝置通訊的應用程式。 API 會執行常見的 USB 相關工作,例如尋找裝置、數據傳輸。
在此情境中,自行設計的裝置是指 Microsoft 沒有提供內建類別驅動程式的裝置。 相反地,您可以將 WinUSB (Winusb.sys) 安裝為設備驅動器。
選擇程式設計模型
如果您安裝 Winusb.sys,以下是程式設計模型選項:
-
Windows 8.1 提供 Windows.Devices.Usb 命名空間,無法在舊版 Windows 中使用。 如需其他Microsoft市集資源,請參閱 通用 Windows 平台檔。
-
在 Windows 8.1 之前,透過 Winusb.sys通訊的應用程式是使用 WinUSB Functions所撰寫的桌面應用程式。 在 Windows 8.1 中,API 集合已擴充。 如需 Windows 應用程式開發的詳細資訊,請參閱 開發 Windows。
選擇最佳程序設計模型的策略取決於各種因素。
您的應用程式是否會與內部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 Microsoft適用於 Windows 8.1 的 Windows 軟體開發工具包 (SDK) |
使用 Visual Studio (Ultimate 或 Professional) 和 Windows Driver Kit (WDK) 8 或更新版本隨附的 WinUSB 應用程式 範本。 針對等時傳輸,使用 Visual Studio 2013 與 Windows Driver Kit(WDK)8.1 或更新版本。 |
程式設計語言 | C#、VB.NET、C++、JavaScript | C/C++ |
功能開發
關鍵情境 | UWP 應用程式 | Windows 桌面應用程式 |
---|---|---|
設備偵測 | 使用 Windows.Devices.Enumeration 命名空間來取得 UsbDevice。 | 使用 SetupAPI 和 WinUsb_Initialize 來取得WINUSB_INTERFACE_HANDLE。 |
USB 控制傳輸 |
UsbSetupPacket Usb控制請求類型 UsbDevice.SendControlInTransferAsync UsbDevice.SendControlOutTransferAsync |
WINUSB_SETUP_PACKET WinUsb_ControlTransfer |
取得USB描述元 |
UsbDevice.DeviceDescriptor UsbConfiguration.Descriptors UsbInterface.Descriptors UsbEndpointDescriptor |
WinUsb_GetDescriptor |
執行USB批量傳輸 |
UsbBulkInPipe UsbBulkOutPipe |
WinUsb_ReadPipe WinUsb_WritePipe |
傳送USB中斷傳輸 |
UsbInterruptInPipe UsbInterruptOutPipe |
WinUsb_ReadPipe WinUsb_WritePipe |
傳送USB等時性傳輸 | 不支援。 |
WinUsb_ReadIsochPipe WinUsb_ReadIsochPipeAsap WinUsb_WriteIsochPipe WinUsb_WriteIsochPipeAsap |
關閉裝置 | UsbDevice.Close | WinUsb_Free |
文件資料
文件資料 | UWP 應用程式 | Windows 桌面應用程式 |
---|---|---|
程序設計指南 | 與 USB 裝置溝通的完整過程 | 如何使用 WinUSB Functions 存取 USB 裝置 |
API 參考資料 | Windows.Devices.Usb | WinUSB 功能 |