Share via


Senden einer USB-Steuerübertragung (UWP-App)

In diesem Artikel wird Folgendes veranschaulicht:

  • Formatieren eines USB-Setuppakets
  • Initiieren einer USB-Steuerungsübertragung über Ihre App

Wichtige APIs

Eine App, die mit einem USB-Gerät kommuniziert, sendet in der Regel mehrere Anforderungen an die Steuerungsübertragung. Diese Anforderungen erhalten Informationen über das Gerät und senden Steuerungsbefehle, die vom Hardwarehersteller definiert wurden. In diesem Thema erfahren Sie mehr über Steuerungsübertragungen und wie Sie sie in Ihrer UWP-App formatieren und senden.

Eine Steuerungsübertragung kann Konfigurationsinformationen lesen oder schreiben oder gerätespezifische Funktionen ausführen, die vom Hardwarehersteller definiert wurden. Wenn die Übertragung einen Schreibvorgang ausführt, handelt es sich um eine OUT-Übertragung. ein Lesevorgang, es handelt sich um eine IN-Übertragung. Unabhängig von der Richtung erstellt und initiiert eine Software, z. B. Ihre UWP-App, auf dem Hostsystem immer eine Anforderung für eine Steuerungsübertragung. Manchmal kann Ihre App Steuerungsübertragungen initiieren, die Daten lesen oder schreiben. In diesem Fall müssen Sie möglicherweise einen zusätzlichen Puffer senden.

Windows.Devices.Usb bietet die folgenden Methoden, um alle Arten von Steuerungsübertragungen zu berücksichtigen:

USB-Steuerungsübertragung für Windows-Runtime-APIs für USB.

USB-Steuerübertragungen werden auch verwendet, um Deskriptordaten abzurufen oder Standardbefehle zu senden. Es wird jedoch empfohlen, diese Arten von Anforderungen zu senden, indem Sie bestimmte Von Windows.Devices.Usb bereitgestellte Methoden aufrufen, anstatt manuell eine Steuerungsübertragung zu erstellen. Um beispielsweise eine alternative Einstellung auszuwählen, rufen Sie SelectSettingAsync auf, anstatt SendControlOutTransferAsync (UsbSetupPacket) aufzurufen.

Steuerungsübertragungen für bestimmte Arten von Standardanforderungen werden nicht unterstützt. Wenn Ihr Gerät jedoch zu einer Geräteklasse gehört, die von Windows.Devices.Usb unterstützt wird, können Sie einige Anforderungen senden, wie in der Geräteklassenspezifikation definiert.

Vorbereitung

  • Sie müssen das Gerät geöffnet und das UsbDevice-Objekt abgerufen haben. Weitere Informationen finden Sie unter Herstellen einer Verbindung mit einem USB-Gerät (UWP-App).
  • Abrufen von Informationen zu vom Anbieter definierten Steuerungsbefehlen. Diese Befehle werden in der Regel in der Hardwarespezifikation definiert.
  • Den vollständigen Code, der in diesem Thema gezeigt wird, finden Sie im CustomUsbDeviceAccess-Beispiel, Scenario2_ControlTransfer.cpp und Scenario2_ControlTransfer.h.

Schritt 1: Auffüllen des Setuppakets

In diesem Thema senden wir eine Steuerungsübertragung an ein Gerät, das das Licht in verschiedenen Mustern blinkt. Um das Setuppaket aufzufüllen, müssen Sie wissen, dass die Steuerungsbefehle vom Hardwarehersteller definiert sind:

  • bmRequestType (D7): OUT
  • bmRequestType (D4): Gerät
  • bmRequestType (D6... D5): Anbieter
  • bRequest: 0x03
  • wValue: 0-7 (beliebige Zahl in diesem Bereich, inklusive)
  • wIndex: 0
  • wLength: 0

Für die Steuerungsübertragung müssen Sie ein Setuppaket auffüllen , das alle Informationen zur Übertragung enthält. gibt an, ob die Anforderung Daten, den Anforderungstyp usw. liest oder schreibt. Das Format des Setuppakets ist in der offiziellen USB-Spezifikation definiert. Die Werte der Setuppaketfelder werden von der Hardwarespezifikation des Geräts bereitgestellt.

  1. Erstellen Sie ein UsbSetupPacket-Objekt .

  2. Füllen Sie das UsbSetupPacket-Objekt auf, indem Sie verschiedene Eigenschaften festlegen. In dieser Tabelle sind die USB-definierten Setuppaketfelder und die Eigenschaften aufgeführt, die diesen Feldern entsprechen:

    Felder in Abschnitt 9.3 Eigenschaft BESCHREIBUNG
    bmRequestType (D7) UsbControlRequestType.Direction Richtung der Anforderung. Gibt an, ob die Anforderung vom Host zum Gerät (Ausgehende Übertragungen) oder vom Gerät zum Host (in Übertragungen) erfolgt.
    bmRequestType (D4) UsbControlRequestType.Recipient Empfänger der Anforderung. Alle Steuerelementübertragungen zielen auf den Standardendpunkt ab. Der Empfänger kann jedoch ein Gerät, eine Schnittstelle, ein Endpunkt oder ein anderer sein. Weitere Informationen zu USB-Gerät, Schnittstelle und Endpunkthierarchie finden Sie unter Gerätelayout.
    bmRequestType (D6... D5) UsbControlRequestType.ControlTransferType Kategorie der Anforderung. Standard, Klasse oder Anbieter.
    bRequest UsbSetupPacket.Request Der Anforderungstyp. Wenn es sich bei der Anforderung um eine Standardanforderung handelt, z. B. eine GET_DESCRIPTOR-Anforderung, wird diese Anforderung durch die USB-Spezifikation definiert. Andernfalls könnte er vom Hersteller definiert werden.
    wValue UsbSetupPacket.Value Hängt vom Typ der Anforderung ab.
    Windex UsbSetupPacket.Index Hängt vom Typ der Anforderung ab.
    wLength UsbSetupPacket.Length Länge des Datenpakets, das in dieser Anforderung gesendet oder empfangen wird.

! [HINWEIS] Für bestimmte Steuerelementübertragungen müssen Sie möglicherweise bmRequestType als unformatiertes Byte angeben. In diesem Fall können Sie das Byte in der UsbControlRequestType.AsByte-Eigenschaft festlegen.

Schritt 2: Starten eines asynchronen Vorgangs zum Senden der Steuerungsübertragung

Zum Senden von Steuerungsübertragungen benötigen Sie ein UsbDevice-Objekt . Für die Steuerungsübertragung sind möglicherweise Datenpakete erforderlich, die dem Setuppaket folgen.

Um eine Steuerelementübertragung zu initiieren, rufen Sie die Überschreibung von SendControlInTransferAsync oder SendControlOutTransferAsync auf. Wenn die Übertragung Datenpakete verwendet, rufen Sie SendControlOutTransferAsync (UsbSetupPacket, IBuffer), SendControlInTransferAsync (UsbSetupPacket, IBuffer) auf. Diese Methoden verwenden einen zusätzlichen Parameter, der die Daten zum Schreiben oder Empfangen von Daten vom Gerät enthält. Verwenden Sie das Flussdiagramm, um zu bestimmen, welche Außerkraftsetzung aufgerufen werden soll.

Der Aufruf startet den asynchronen Vorgang. Wenn der Vorgang abgeschlossen ist, gibt der Aufruf das IAsyncOperation-Objekt zurück, das Ergebnisse des Vorgangs enthält. Bei einer OUT-Übertragung gibt das -Objekt die Anzahl der in einer Übertragung gesendeten Bytes zurück. Bei einer IN-Übertragung enthält das -Objekt den Puffer, der Daten enthält, die vom Gerät gelesen wurden.

Beispiel für USB-Steuerungsübertragungscode

In diesem Beispielcode wird gezeigt, wie eine Steuerungsübertragung gesendet wird, die das Blinkmuster auf dem SuperMUTT-Gerät ändert. Das Setuppaket für die Übertragung enthält einen vom Anbieter definierten Befehl. Das Beispiel befindet sich in Scenario2_ControlTransfer.cpp.

async Task SetSuperMuttLedBlinkPatternAsync(Byte pattern)
        {
            UsbSetupPacket initSetupPacket = new UsbSetupPacket
            {
                RequestType = new UsbControlRequestType
                {
                    Direction = UsbTransferDirection.Out,
                    Recipient = UsbControlRecipient.Device,
                    ControlTransferType = UsbControlTransferType.Vendor
                },
                Request = SuperMutt.VendorCommand.SetLedBlinkPattern,
                Value = pattern,
                Length = 0
            };

            UInt32 bytesTransferred = await EventHandlerForDevice.Current.Device.SendControlOutTransferAsync(initSetupPacket);

            MainPage.Current.NotifyUser("The Led blink pattern is set to " + pattern.ToString(), NotifyType.StatusMessage);
        }

In diesem Beispielcode wird gezeigt, wie eine Steuerungsübertragung gesendet wird, die das Blinkmuster auf dem SuperMUTT-Gerät ändert. Das Setuppaket für die Übertragung enthält einen vom Anbieter definierten Befehl. Das Beispiel befindet sich in Scenario2_ControlTransfer.cpp.

async Task<IBuffer> SendVendorControlTransferInToDeviceRecipientAsync(Byte vendorCommand, UInt32 dataPacketLength)
 {
    // Data will be written to this buffer when we receive it
    var buffer = new Windows.Storage.Streams.Buffer(dataPacketLength);

    UsbSetupPacket initSetupPacket = new UsbSetupPacket
    {
        RequestType = new UsbControlRequestType
        {
            Direction = UsbTransferDirection.In,
            Recipient = UsbControlRecipient.Device,
            ControlTransferType = UsbControlTransferType.Vendor,
        },
        Request = vendorCommand,
        Length = dataPacketLength
    };

    return await EventHandlerForDevice.Current.Device.SendControlInTransferAsync(initSetupPacket, buffer);
}