Panoramica dello sviluppo di applicazioni Windows per dispositivi USB

Riepilogo:

  • Linee guida per la scelta del modello di programmazione appropriato
  • Esperienza di sviluppo di app desktop e app UWP

API importanti:

Questo articolo fornisce linee guida per decidere se scrivere un'app UWP o un'app desktop di Windows per comunicare con un dispositivo USB.

Windows fornisce set di API che è possibile usare per scrivere app che comunicano con dispositivi USB personalizzati. L'API esegue attività comuni correlate a USB, ad esempio, la ricerca del dispositivo, i trasferimenti di dati.

Il dispositivo personalizzato in questo contesto significa un dispositivo per il quale Microsoft non fornisce un driver di classe in-box. È invece possibile installare WinUSB (Winusb.sys) come driver di dispositivo.

Scelta di un modello di programmazione

Se si installa Winusb.sys, ecco le opzioni del modello di programmazione:

La strategia per la scelta del modello di programmazione migliore dipende da diversi fattori.

  • L'app comunicherà con un dispositivo USB interno?

    Le API sono progettate principalmente per l'accesso ai dispositivi periferici. L'API può anche accedere ai dispositivi USB interni del PC. Tuttavia, l'accesso ai dispositivi USB interni del PC da un'app UWP è limitato a un'app con privilegi dichiarata in modo esplicito nei metadati del dispositivo dall'OEM per tale PC.

  • L'app comunicherà con gli endpoint isocroni USB?

    Se l'app trasmette dati a o da endpoint isocroni del dispositivo, devi scrivere un'app desktop di Windows. In Windows 8.1 sono state aggiunte nuove funzioni WinUSB al set di API che consente a un'app desktop di inviare e ricevere dati da endpoint isocroni.

  • L'app è un tipo di app "pannello di controllo"?

    Le app UWP sono app per utente e non hanno la possibilità di apportare modifiche all'esterno dell'ambito di ogni app. Per questi tipi di app, è necessario scrivere un'app desktop di Windows.

  • La classe di dispositivi USB è supportata dalle app UWP?

    Scrivere un'app UWP se il dispositivo appartiene a una di queste classi di dispositivo.

    • 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 * *

    Nota

    Se il dispositivo appartiene alla classe DeviceFirmwareUpdate, l'app deve essere un'app con privilegi.

Se il dispositivo non appartiene a una delle classi di dispositivo precedenti, scrivere un'app desktop di Windows.

Requisito del driver

Requisito del driver App UWP App desktop di Windows
Driver di funzione Winusb.sys fornita da Microsoft (driver in modalità kernel). Winusb.sys fornita da Microsoft (driver in modalità kernel).
Driver di filtro Se sono presenti driver di filtro, l'accesso è limitato alle app con privilegi. L'app viene dichiarata come app con privilegi nei metadati del dispositivo dall'OEM. Il driver di filtro può essere presente nello stack di dispositivi in modalità kernel, purché non blocchi l'accesso a Winusb.sys.

Esempi di codice

Esempio App UWP App desktop di Windows
Introduzione a questi esempi

Strumenti di sviluppo

Strumenti di sviluppo App UWP App desktop di Windows
Ambiente per sviluppatori Microsoft Visual Studio 2013

Microsoft Windows Software Development Kit (SDK) per Windows 8.1
Usare il modello di applicazione WinUSB incluso in Visual Studio (Ultimate o Professional) e Windows Driver Kit (WDK) 8 o versione successiva.

Per i trasferimenti isocroni, Visual Studio 2013 con Windows Driver Kit (WDK) 8.1 o versione successiva.
Linguaggi di programmazione C#, VB.NET, C++, JavaScript C/C++

Implementazione delle funzionalità

Scenario chiave App UWP App desktop di Windows
Individuazione del dispositivo Usare lo spazio dei nomi Windows.Devices.Enumeration per ottenere un usbDevice. Usare SetupAPI e WinUsb_Initialize per ottenere un WINUSB_INTERFACE_HANDLE.
Trasferimento di controlli USB UsbSetupPacket
UsbControlRequestType
UsbDevice.SendControlInTransferAsync
UsbDevice.SendControlOutTransferAsync
WINUSB_SETUP_PACKET
WinUsb_ControlTransfer
Recupero di descrittori USB UsbDevice.DeviceDescriptor
UsbConfiguration.Descriptors
UsbInterface.Descriptors
UsbEndpointDescriptor
WinUsb_GetDescriptor
Invio del trasferimento bulk USB UsbBulkInPipe
UsbBulkOutPipe
WinUsb_ReadPipe
WinUsb_WritePipe
Invio del trasferimento di interrupt USB UsbInterruptInPipe
UsbInterruptOutPipe
WinUsb_ReadPipe
WinUsb_WritePipe
Invio di un trasferimento isocrono USB Non supportato. WinUsb_ReadIsochPipe
WinUsb_ReadIsochPipeAsap
WinUsb_WriteIsochPipe
WinUsb_WriteIsochPipeAsap
Chiusura del dispositivo UsbDevice.Close WinUsb_Free

Documentazione

Documentazione App UWP App desktop di Windows
Guida per programmatori Parlare con i dispositivi USB, iniziare a terminare Come accedere a un dispositivo USB usando le funzioni WinUSB
API (riferimento) Windows.Devices.Usb Funzioni WinUSB