開發適用於 USB 裝置的 Windows 應用程式概觀
摘要:
- 選擇正確程序設計模型的指導方針
- UWP 應用程式和傳統型應用程式開發人員體驗
重要 API:
本文提供指導方針,讓您決定是否應該撰寫 UWP 應用程式或 Windows 傳統型應用程式來與 USB 裝置通訊。
Windows 提供 API 集合,可讓您用來撰寫與自定義 USB 裝置通訊的應用程式。 API 會執行常見的 USB 相關工作,例如尋找裝置、數據傳輸。
此內容中的自定義裝置表示 Microsoft 不提供內建類別驅動程式的裝置。 相反地,您可以將 WinUSB (Winusb.sys 安裝為設備驅動器) 。
選擇程式設計模型
如果您安裝 Winusb.sys,以下是程式設計模型選項:
-
Windows 8.1 提供 Windows.Devices.Usb 命名空間,無法在舊版 Windows 中使用。 如需其他 Microsoft Store 資源,請參閱 通用 Windows 平台 檔。
-
在 Windows 8.1 之前,透過 Winusb.sys通訊的應用程式是使用 WinUSB Functions 撰寫的桌面應用程式。 在 Windows 8.1 中,已擴充 API 集合。 如需 Windows 應用程式開發的詳細資訊,請參閱 開發 Windows。
選擇最佳程序設計模型的策略取決於各種因素。
您的應用程式是否會與內部 USB 裝置通訊?
API 主要是設計來存取周邊裝置。 API 也可以存取計算機內部 USB 裝置。 不過,從 UWP app 存取計算機內部 USB 裝置僅限於由 OEM 針對該電腦在裝置元數據中明確宣告的特殊許可權應用程式。
您的應用程式是否會與 USB 同步端點通訊?
如果您的 app 在裝置的不時序端點傳輸資料,您必須撰寫 Windows 傳統型應用程式。 在 Windows 8.1 中,新的 WinUSB Functions 已新增至 API 集合,可讓傳統型應用程式傳送數據,以及從不時點接收數據。
您的應用程式是否為應用程式的「控制面板」類型?
UWP 應用程式是每個使用者的應用程式,而且無法在每個應用程式的範圍之外進行變更。 針對這些類型的應用程式,您必須撰寫 Windows 傳統型應用程式。
UWP app 是否支援 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 app | Windows 傳統型應用程式 |
---|---|---|
函式驅動程式 | Microsoft 提供的 Winusb.sys( 內核模式驅動程式) 。 | Microsoft 提供的 Winusb.sys( 內核模式驅動程式) 。 |
篩選驅動程式 | 如果篩選驅動程式存在,存取權僅限於具特殊許可權的應用程式。 應用程式會在 OEM 的裝置元資料中宣告為特殊許可權應用程式。 | 只要篩選驅動程式不會封鎖 存取Winusb.sys,篩選驅動程式就可以出現在核心模式裝置堆疊中。 |
程式碼範例
樣本 | UWP app | Windows 傳統型應用程式 |
---|---|---|
開始使用這些範例 |
|
開發工具
開發工具 | UWP app | Windows 傳統型應用程式 |
---|---|---|
開發人員環境 | Microsoft Visual Studio 2013 適用於 Windows 8.1 的 Microsoft Windows 軟體開發工具包 (SDK) |
使用 Visual Studio 隨附的 WinUSB 應用程式 範本, (Ultimate 或 Professional) 和 Windows Driver Kit (WDK) 8 或更新版本。 若為連續傳輸,Visual Studio 2013 搭配 Windows 驅動程式套件 (WDK) 8.1 或更新版本。 |
程式語言 | C#、VB.NET、C++、JavaScript | C/C++ |
功能實作
主要案例 | UWP app | Windows 傳統型應用程式 |
---|---|---|
裝置探索 | 使用 Windows.Devices.Enumeration 命名空間來取得 UsbDevice。 | 使用 SetupAPI 和 WinUsb_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 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 app | Windows 傳統型應用程式 |
---|---|---|
程式設計手冊 | 與 USB 裝置交談,開始完成 | 如何使用 WinUSB 函式存取 USB 裝置 |
API 參考資料 | Windows.Devices.Usb | WinUSB 函式 |