Kommunizieren mit USB-Geräten von Anfang bis Ende (UWP-App)

Dieser Artikel enthält eine umfassende exemplarische Vorgehensweise zum Erstellen einer UWP-App, die mit einem USB-Gerät kommuniziert.

Verwenden Sie die Windows-Runtime-APIs, um UWP-Apps zu schreiben, die Benutzern Zugriff auf ihr USB-Peripheriegerät gewähren. Solche Apps können basierend auf benutzerspezifischen Kriterien eine Verbindung mit einem Gerät herstellen, Informationen über das Gerät abrufen, Daten an das Gerät senden und umgekehrt Datenströme vom Gerät abrufen und das Gerät nach Unterbrechungsdaten abfragen.

Hier wird beschrieben, wie Ihre UWP-App diese Aufgaben implementieren kann, und links zu Beispielen, die die Verwendung von Klassen veranschaulichen, die in Windows.Devices.Usb enthalten sind. Wir erfahren, welche Gerätefunktionen im App-Manifest erforderlich sind, und erfahren, wie Sie die App starten, wenn das Gerät eine Verbindung herstellt. Außerdem wird gezeigt, wie Sie eine Datenübertragungsaufgabe im Hintergrund ausführen, auch wenn die App angehalten wird, um die Akkulaufzeit zu sparen.

Exemplarische Vorgehensweise: Schreiben einer UWP-App für USB-Geräte

Führen Sie die Schritte in diesem Artikel aus, oder fahren Sie direkt mit dem Beispiel für den Zugriff auf benutzerdefinierte USB-Geräte fort. Im Begleitbeispiel werden alle hier aufgeführten Schritte implementiert, aber um die Dinge in Bewegung zu halten, werden wir den Code nicht durchlaufen. Für bestimmte Schritte wird im Beispielabschnitt "Suchen " angezeigt, damit Sie den Code schnell finden können. Die Struktur der Quelldateien des Beispiels ist einfach und flach, sodass Sie Code problemlos finden können, ohne einen Drilldown durch mehrere Ebenen von Quelldateien durchführen zu müssen. Aber Sie können es vorziehen, Ihr eigenes Projekt anders zu trennen und zu organisieren.

Installieren des Microsoft WinUSB-Treibers

Installieren Sie den von Microsoft bereitgestellten WinUSB-Treiber als Funktionstreiber für Ihr Gerät.

Schnellstart:WinUSB-Installation (Winusb.sys)

Sie können Winusb.sys auf folgende Weise installieren:

  • Wenn Sie Ihr Gerät verbinden, stellen Sie möglicherweise fest, dass Windows automatisch Winusb.sys lädt, da es sich bei dem Gerät um ein WinUSB-Gerät handelt.
  • Installieren Sie den Treiber, indem Sie die vom System bereitgestellte Geräteklasse in Geräte-Manager angeben.
  • Installieren Sie den Treiber mithilfe eines benutzerdefinierten INF. Sie können das INF auf eine der folgenden beiden Arten abrufen:
    • Rufen Sie den INF vom Hardwarehersteller ab.
    • Schreiben Sie eine benutzerdefinierte INF, die auf die von Microsoft bereitgestellte Datei Winusb.inf verweist. Weitere Informationen finden Sie unter WinUSB-Installation (Winusb.sys).

Abrufen von Informationen zu Ihrem Gerät

Rufen Sie die GUID der Geräteschnittstelle, die Hardware-ID und die Geräteklasseninformationen zu Ihrem Gerät ab.

Sie können diese Informationen vom Gerätehersteller abrufen.

  • Anbieter- und Produktbezeichner

    Zeigen Sie in Geräte-Manager die Geräteeigenschaften an. Zeigen Sie auf der Registerkarte Details den Wert der Hardware-ID-Eigenschaft an. Dieser Wert ist eine Kombination dieser beiden Bezeichner. Beispielsweise lautet die Hardware-ID für das SuperMUTT-Gerät "USB\VID_045E&PID_F001". Die Anbieter-ID lautet "0x045E" und die Produkt-ID "0xF001".

  • Geräteklasse, Unterklasse und Protokollcodes

  • GUID der Geräteschnittstelle

Alternativ können Sie Informationen in der Registrierung anzeigen. Weitere Informationen finden Sie unter Registrierungseinträge für USB-Geräte.

Ermitteln Sie, ob der USB-API-Satz die Geräteklasse, Unterklasse und das Protokoll zulässt.

Sie können eine UWP-App schreiben, wenn die Geräteklasse, unterklasse und der Protokollcode des Geräts in der folgenden Liste enthalten sind:

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

Erstellen eines einfachen Visual Studio-Projekts

Erstellen Sie ein einfaches Visual Studio-Projekt, das Sie in diesem Tutorial erweitern können.

Weitere Informationen finden Sie unter Erste Schritte mit UWP-Apps.

Hinzufügen von USB-Gerätefunktionen zum App-Manifest

Erfahren Sie, wie Sie dem App-Manifest USB-Gerätefunktionen hinzufügen.

Schnellstart:Hinzufügen von USB-Gerätefunktionen zum App-Manifest

Öffnen Sie Ihre Package.appxmanifest-Datei in einem Text-Editor, und fügen Sie das DeviceCapability-Element hinzu, wobei das Name-Attribut wie in diesem Beispiel auf "usb" festgelegt ist.

Hinweis

Sie können die USB-Gerätefunktion in Visual Studio nicht ändern. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf die Datei Package.appxmanifest, und wählen Sie Öffnen mit... und dann XML (Text)-Editor aus. Die Datei wird im einfachen XML-Format geöffnet.

<Capabilities>
  <!--When the device's classId is FF * *, there is a predefined name for the class.
      You can use the name instead of the class id.
      There are also other predefined names that correspond to a classId.-->
  <m2:DeviceCapability Name="usb">
    <!--SuperMutt Device-->
    <m2:Device Id="vidpid:045E 0611">
      <!--<wb:Function Type="classId:ff * *"/>-->
      <m2:Function Type="name:vendorSpecific"/>
    </m2:Device>
  </m2:DeviceCapability>
</Capabilities>

Finden Sie es im Beispiel: Die USB-Gerätefunktionen befinden sich in der Datei Package.appxmanifest.

Öffnen des Geräts für die Kommunikation

Erweitern Sie die App, um das Gerät für die Kommunikation zu öffnen.

Schnellstart:Herstellen einer Verbindung mit einem USB-Gerät (UWP-App)

  1. Suchen Sie das Gerät, indem Sie eine Zeichenfolge für erweiterte Abfragesyntax (Advanced Query Syntax, AQS) erstellen, die Suchkriterien für die Suche nach dem Gerät in der aufgezählten Gerätesammlung enthält.
  2. Öffnen Sie das Gerät auf zwei Arten:
  3. Rufen Sie das Gerät instance über die eigenschaft DeviceInformation.Id ab.
  4. Rufen Sie FromIdAsync auf, indem Sie das Gerät instance Zeichenfolge übergeben und das UsbDevice-Objekt abrufen.

Finden Sie es im Beispiel: Siehe Dateien mit dem Namen Scenario1_DeviceConnect.

Untersuchen des USB-Gerätelayouts

Untersuchen Sie das Layout Ihres USB-Geräts.

Informieren Sie sich über grundlegende USB-Konzepte zum Konfigurieren des Geräts und durchführen von Datenübertragungen: Konzepte für alle USB-Entwickler.

Zeigen Sie den Gerätekonfigurationsdeskriptor, Schnittstellendeskriptoren für die einzelnen unterstützten alternativen Einstellungen und deren Endpunktdeskriptoren an. Mithilfe von USBView können Sie alle USB-Controller und die damit verbundenen USB-Geräte durchsuchen und auch die Gerätekonfiguration überprüfen.

Abrufen und Anzeigen von USB-Deskriptoren auf der Benutzeroberfläche

Erweitern Sie die App, um USB-Deskriptoren auf der Benutzeroberfläche abzurufen und anzuzeigen.

Schnellstart:Abrufen von USB-Deskriptoren (UWP-App)

Finden Sie es im Beispiel: Siehe Dateien mit dem Namen Scenario5_UsbDescriptors.

Senden von vom Hersteller definierten USB-Steuerungsübertragungen

Erweitern Sie die App, um vom Anbieter definierte USB-Steuerungsübertragungen zu senden.

Schnellstart:Senden einer USB-Steuerungsübertragungsanforderung (UWP-App)

  1. Rufen Sie den Vendor-Befehl aus der Hardwarespezifikation des Geräts ab.
  2. Erstellen Sie ein UsbSetupPacket-Objekt , und füllen Sie das Setuppaket auf, indem Sie verschiedene Eigenschaften festlegen.
  3. Starten Sie einen asynchronen Vorgang, um die Steuerungsübertragung abhängig von der Übertragungsrichtung mit den folgenden Methoden zu senden:

Finden Sie es im Beispiel: Siehe Dateien mit dem Namen Scenario2_ControlTransfer.

Lesen oder Schreiben von Massendaten

Erweitern Sie die App, um Massendaten zu lesen oder zu schreiben.

Schnellstart:Senden einer USB-Massenübertragungsanforderung (UWP-App)

  1. Rufen Sie das Bulk pipe-Objekt (UsbBulkOutPipe oder UsbBulkInPipe) ab.
  2. Konfigurieren Sie die Massenpipe zum Festlegen von Richtlinienparametern.
  3. Richten Sie den Datenstrom mithilfe des DataReader - oder DataWriter-Objekts ein.
  4. Starten Sie einen asynchronen Übertragungsvorgang, indem Sie DataReader.LoadAsync oder DataWriter.StoreAsync aufrufen.
  5. Abrufen der Ergebnisse des Übertragungsvorgangs.

Finden Sie es im Beispiel: Siehe Dateien mit dem Namen Scenario4_BulkPipes.

Abrufen von Hardwareunterbrechungsdaten

Erweitern Sie die App, um Hardwareunterbrechungsdaten abzurufen.

Schnellstart:Senden einer USB-Interruptübertragungsanforderung (UWP-App)

  1. Rufen Sie das Interruptpipeobjekt (UsbInterruptInPipe oder UsbInterruptOutPipe) ab.
  2. Implementieren Sie den Interrupthandler für das DataReceived-Ereignis .
  3. Registrieren Sie den Ereignishandler, um mit dem Empfangen von Daten zu beginnen.
  4. Heben Sie die Registrierung des Ereignishandlers auf, um den Empfang von Daten zu beenden.

Finden Sie es im Beispiel: Weitere Informationen finden Sie unter Dateien mit dem Namen Scenario3_InterruptPipes.

Auswählen einer Schnittstelleneinstellung, die derzeit nicht aktiv ist

Erweitern Sie die App, um eine Schnittstelleneinstellung auszuwählen, die derzeit nicht aktiv ist.

Schnellstart:Auswählen einer USB-Schnittstelleneinstellung (UWP-App)

Wenn das Gerät für die Kommunikation geöffnet wird, werden die Standardschnittstelle und die erste Einstellung ausgewählt. Wenn Sie diese Einstellung ändern möchten, führen Sie die folgenden Schritte aus:

  1. Rufen Sie die aktive Einstellung einer USB-Schnittstelle mithilfe des UsbInterfaceSetting.Selected-Werts ab.
  2. Legen Sie eine USB-Schnittstelleneinstellung fest, indem Sie einen asynchronen Vorgang starten, indem Sie UsbInterfaceSetting.SelectSettingAsync aufrufen.

Schließen des Geräts

Erweitern Sie die App, um das Gerät zu schließen.

Schnellstart:Herstellen einer Verbindung mit einem USB-Gerät (UWP-App)

Schließen Sie das Gerät, nachdem Sie das UsbDevice-Objekt verwendet haben.

C++-Apps müssen den Verweis mithilfe des delete-Schlüsselwort (keyword) freigeben. C#/VB-Apps müssen die UsbDevice.Dispose-Methode aufrufen. JavaScript-Apps müssen UsbDevice.Close aufrufen.

Finden Sie es im Beispiel: Siehe Dateien mit dem Namen Scenario1_DeviceConnect.

Erstellen eines Gerätemetadatenpakets

Erstellen Sie ein Gerätemetadatenpaket für die App.

Tool:Assistent zum Erstellen von Gerätemetadaten

  • Wenn Sie das Windows Driver Kit (WDK) installiert haben, öffnen Sie dieTreibergerätemetadatenerstellung>>.
  • Wenn Sie das eigenständige SDK installiert haben, befindet sich das Tool unter <install_path>\bin\x86\DeviceMetadataWizardexe.

Ordnen Sie Ihre App dem Gerät zu, indem Sie die Schritte im Assistenten ausführen. Geben Sie diese Informationen zu Ihrem Gerät ein:

  • Geben Sie auf der Seite GeräteinformationenModellname, Hersteller und Beschreibung ein.
  • Geben Sie auf der Seite Hardwareinformationen die Hardware-ID Ihres Geräts ein.

Führen Sie die folgenden Anweisungen aus, um die App als privilegierte App für Ihr Gerät zu deklarieren:

  1. Geben Sie auf der Seite App-Info in der Gruppe Privilegierte Anwendung den Paketnamen, den Herausgebernamen und die UWP-App-ID ein.

    Screenshot von Visual Studio mit Gerätemetadaten für privilegierte Apps

    Hinweis

    Aktivieren Sie nicht die Option Benutzerdefinierter Treiber für Access .

  2. Öffnen Sie die Registerkarte Fertig stellen . Aktivieren Sie das Kontrollkästchen Pakete in den lokalen Metadatenspeicher Ihres Systems kopieren .

  3. Verbinden Sie das Gerät, öffnen Sie in Systemsteuerung Geräte und Drucker anzeigen, und überprüfen Sie, ob das Symbol des Geräts korrekt ist.

Finden Sie es im Beispiel: Weitere Informationen finden Sie im Ordner DeviceMetadata.

Implementieren der Aktivierung der automatischen Wiedergabe

Erweitern Sie die App, indem Sie die Automatische Wiedergabeaktivierung implementieren, um die App zu starten, wenn das Gerät eine Verbindung mit dem System herstellt.

Schnellstart:Registrieren einer App für ein Gerät für die automatische Wiedergabe

Sie können Funktionen für die automatische Wiedergabe hinzufügen, damit die App gestartet wird, wenn das Gerät eine Verbindung mit dem System herstellt. Sie können die automatische Wiedergabe für alle UWP-Apps (privilegiert oder anderweitig) aktivieren.

  1. In Ihrem Gerätemetadatenpaket müssen Sie angeben, wie das Gerät auf eine Benachrichtigung zur automatischen Wiedergabe reagieren soll. Wählen Sie auf der Registerkarte Windows-Info die Option UWP-Geräte-App aus, und geben Sie app-Informationen wie hier gezeigt ein:

  2. Fügen Sie im App-Manifest die Automatische Wiedergabegerätedeklaration hinzu, und starten Sie informationen wie hier gezeigt:

    Screenshot: App-Manifest mit ausgewählter Option

  3. Überprüfen Sie in der OnActivated-Methode der App-Klasse, ob das Gerät die App aktiviert hat. Wenn dies der Grund ist, empfängt die Methode einen DeviceEventArgs-Parameterwert, der den DeviceInformation.Id-Eigenschaftswert enthält. Dies ist der gleiche Wert, der unter Öffnen des Geräts für die Kommunikation beschrieben wird.

Finden Sie es im Beispiel: Weitere Informationen finden Sie unter Dateien mit dem Namen Automatische Wiedergabe. Informationen zu JavaScript finden Sie unter default.js.

Implementieren einer Hintergrundaufgabe

Erweitern Sie die App, um eine Hintergrundaufgabe zu implementieren, die Längenübertragungen an das Gerät durchführen kann, z. B. Firmwareupdates, ohne dass die App angehalten wird.

Zum Implementieren von Hintergrundaufgaben benötigen Sie zwei Klassen.

Die Hintergrundaufgabenklasse implementiert die IBackgroundTask-Schnittstelle und enthält den tatsächlichen Code, den Sie zum Synchronisieren oder Aktualisieren Ihres Peripheriegeräts erstellen. Die Hintergrundaufgabenklasse wird ausgeführt, wenn die Hintergrundaufgabe und vom Einstiegspunkt aus ausgelöst wird, der im Anwendungsmanifest Ihrer App bereitgestellt wird.

Hinweis

Die von Windows 8.1 bereitgestellte Infrastruktur für Gerätehintergrundaufgaben. Weitere Informationen zu Windows-Hintergrundaufgaben finden Sie unter Unterstützen Ihrer App mit Hintergrundaufgaben.

Hintergrundaufgabenklasse

  1. Implementiert die IBackgroundTask-Schnittstelle , die für die Windows-Hintergrundaufgabeninfrastruktur erforderlich ist.
  2. Ruft die DeviceUseDetails-instance ab, die an die Klasse in der Run-Methode übergeben wird, und verwendet diese instance, um den Fortschritt an die Microsoft Store-App zu melden und sich für Abbruchereignisse zu registrieren.
  3. Die Run-Methode ruft auch die privaten OpenDevice- und WriteToDeviceAsync-Methoden auf, die den Hintergrund-Gerätesynchronisierungscode implementieren.

Die UWP-App registriert und löst eine DeviceUseTrigger-Hintergrundaufgabe aus. Die App registriert, löst den Status einer Hintergrundaufgabe aus und behandelt sie.

Hinweis

Der folgende Beispielcode kann mithilfe der entsprechenden Objekte auf die DeviceServicingTrigger-Hintergrundaufgabe angewendet werden. Der einzige Unterschied zwischen den beiden Triggerobjekten und den entsprechenden APIs sind die Richtlinienüberprüfungen, die von Windows durchgeführt werden.

  1. Erstellt DeviceUseTrigger- und BackgroundTaskRegistration-Objekte.
  2. Überprüft, ob Hintergrundaufgaben zuvor von dieser Beispielanwendung registriert wurden, und bricht sie ab, indem die Unregister-Methode für den Task aufgerufen wird.
  3. Registriert die Hintergrundaufgabe, die mit dem Gerät synchronisiert wird. Die SetupBackgroundTask-Methode wird im nächsten Schritt von der SyncWithDeviceAsync-Methode aufgerufen.
    1. Initialisiert deviceUseTrigger und speichert es zur späteren Verwendung.
    2. Erstellt ein BackgroundTaskBuilder-Objekt und verwendet die Eigenschaften Name, TaskEntryPoint und SetTrigger, um das DeviceUseTrigger-Objekt und den Namen der Hintergrundaufgabe der App zu registrieren. Die TaskEntryPoint-Eigenschaft des BackgroundTaskBuilder-Objekts wird auf den vollständigen Namen der Hintergrundaufgabenklasse festgelegt, die ausgeführt wird, wenn die Hintergrundaufgabe ausgelöst wird.
    3. Registriert sich für Abschluss- und Fortschrittsereignisse aus der Hintergrundaufgabe, damit die Microsoft Store-App dem Benutzer Abschluss- und Statusupdates bereitstellen kann.
  4. Die private SyncWithDeviceAsync-Methode registriert die Hintergrundaufgabe, die mit dem Gerät synchronisiert wird, und startet die Hintergrundsynchronisierung.
    1. Ruft die SetupBackgroundTask-Methode aus dem vorherigen Schritt auf und registriert die Hintergrundaufgabe, die mit dem Gerät synchronisiert wird.

    2. Ruft die private StartSyncBackgroundTaskAsync-Methode auf, die die Hintergrundaufgabe startet.

    3. Schließt das Handle der App für das Gerät, um sicherzustellen, dass die Hintergrundaufgabe das Gerät beim Starten öffnen kann.

      Hinweis

      Die Hintergrundaufgabe muss das Gerät öffnen, um das Update auszuführen, damit die Microsoft Store-App ihre Verbindungen mit dem Gerät schließen muss, bevor RequestAsync aufgerufen wird.

    4. Ruft die RequestAsync-Methode des DeviceUseTrigger-Objekts auf, die die Hintergrundaufgabe auslöst und das DeviceTriggerResults-Objekt von RequestAsync zurückgibt, mit dem ermittelt wird, ob die Hintergrundaufgabe erfolgreich gestartet wurde.

      Hinweis

      Windows überprüft, ob alle erforderlichen Überprüfungen von Aufgabeninitiierungsrichtlinien abgeschlossen wurden. Wenn alle Richtlinienüberprüfungen abgeschlossen sind, wird der Updatevorgang jetzt als Hintergrundaufgabe außerhalb der Microsoft Store-App ausgeführt, sodass die App sicher angehalten werden kann, während der Vorgang ausgeführt wird. Windows erzwingt auch alle Laufzeitanforderungen und bricht die Hintergrundaufgabe ab, wenn diese Anforderungen nicht mehr erfüllt sind.

    5. Verwendet das DeviceTriggerResults-Objekt, das von StartSyncBackgroundTaskAsync zurückgegeben wird, um zu bestimmen, ob die Hintergrundaufgabe erfolgreich gestartet wurde. Eine switch-Anweisung wird verwendet, um das Ergebnis von DeviceTriggerResults zu überprüfen.

  5. Implementiert einen privaten OnSyncWithDeviceProgress-Ereignishandler, der die App-Benutzeroberfläche mit dem Fortschritt der Hintergrundaufgabe aktualisiert.
  6. Implementiert einen privaten OnSyncWithDeviceCompleted-Ereignishandler, um den Übergang von Hintergrundaufgaben zur Vordergrund-App zu behandeln, wenn die Hintergrundaufgabe abgeschlossen ist.
    1. Verwendet die CheckResults-Methode des BackgroundTaskCompletedEventArgs-Objekts, um zu bestimmen, ob von der Hintergrundaufgabe Ausnahmen ausgelöst wurden.
    2. Die App öffnet das Gerät erneut zur Verwendung durch die Vordergrund-App, nachdem die Hintergrundaufgabe abgeschlossen ist, und aktualisiert die Benutzeroberfläche, um den Benutzer zu benachrichtigen.
  7. Implementiert Klick-Ereignishandler für private Schaltflächen über die Benutzeroberfläche, um die Hintergrundaufgabe zu starten und abzubrechen.
    1. Der private Sync_Click-Ereignishandler ruft die in den vorherigen Schritten beschriebene SyncWithDeviceAsync-Methode auf.
    2. Der private CancelSync_Click-Ereignishandler ruft die private CancelSyncWithDevice-Methode auf, um die Hintergrundaufgabe abzubrechen.
  8. Die private CancelSyncWithDevice-Methode hebt die Registrierung aller aktiven Gerätesynchronisierungen auf und bricht sie ab, damit das Gerät mithilfe der Unregister-Methode für das BackgroundTaskRegistration-Objekt erneut geöffnet werden kann.

Finden Sie es im Beispiel: Sehen Sie sich Dateien mit dem Namen Scenario7_Sync Dateien an. Die Hintergrundklasse ist in IoSyncBackgroundTask implementiert.

Ausführen des Zertifizierungskits für Windows-Apps

Führen Sie das Zertifizierungskit für Windows-Apps aus.

Verwenden des Zertifizierungskits für Windows-Apps

Empfohlen. Wenn Sie das Zertifizierungskit für Windows-Apps ausführen, können Sie sicherstellen, dass Ihre App die Anforderungen des Microsoft Store erfüllt. Sie sollten es immer dann ausführen, wenn Sie Ihrer App wichtige Funktionen hinzufügen.

UWP-App-Benutzeroberfläche von Anfang bis Ende (XAML)

Erfahren Sie mehr über das Entwerfen der UWP-App-Benutzeroberfläche.

Roadmap für UWP-Apps mit C# und Visual Basic und Roadmap für UWP-Apps mit C++

Erfahren Sie mehr über das Erstellen von UWP-Apps mit C++, C# oder Visual Basic im Allgemeinen.

Asynchrone Programmierung (UWP-Apps)

Erfahren Sie, wie Sie Ihre Apps bei Aufgaben, die möglicherweise längere Zeit in Anspruch nehmen, reaktionsfähig bleiben.

Wichtige APIs