USB HID und LabVIEW



Downloads



Applikation


Mit der AHid.dll ist es sehr einfach Daten mit Ihrem USB HID Gerät auszutauschen. Anhand einer Demo-Anwendungen zeigen wir Ihnen, welche Schritte dabei zu beachten sind. Bild 1 zeigt die Benutzeroberfläche dieser Demo.

Zwei Buttons ermöglichen das Verbindung mit dem HID Gerät und das Senden von Daten.

Die Benutzeroberfläche ist in drei Bereiche unterteilt. Der Bereich Device enthält Werte, die sowohl für den Input- als auch den Output-Bericht (Report) gelten. Hierzu zählen die Hersteller-ID (Vendor ID), die Produkt-ID (Product ID), die Schnittstellen-ID (Interface ID) und die GUID des Gerätes.

Alle Zahlen sind Dezimalzahlen. Die Interface ID ist hartkodiert mit -1 (es wird kein Interface verwendet).

Bild 1: GUI zum Senden und Empfangen von Daten unter Verwendung der AHid.dll.


Der Bereich Output enthält die Daten des Output Reports. Die Report ID ist Null und die Größe beträgt 32. Der Wert Null findet immer dann Verwendung, wenn die ID im Berichtsdeskriptor des HID Gerätes nicht definiert ist.

Der Bereich Input enthält die Daten für den Input Report. Alle Werte hierin finden sich ebenfalls im Berichtsdeskriptor .

Der Berichtsdeskriptor ist Bestandteil der Firmware eines jeden USB HID Geräts. Fragen Sie Ihren Hardware-Entwickler.

Workflow


Die Funktionen der AHid.dll werden innerhalb eines Zusatndsautomaten aufgerufen. Folgende Zustände werden verwendet:

- Disconnected: Ruhezustand.
- Init: Initialisierung des Treibers.
- Register: Erstellen der Pipe-Handles.
- Idle: Datenempfang und Verbindungsstatus.
- Write: Scheiben von Daten.
- Deregister: Aufräumarbeiten.

Die Anwendung beginnt im Disconnected Status und bleibt da solange bis der Connect Button gedrückt wird (Bild 2).

Bild 2: Disconnected: nichts zu tun hier.


Bild 3 zeigt die Initialisierung der AHid.dll. Sie wird durch einen Aufruf von AHid_init() ausgeführt.

Bild 3: Initialisierung mit AHid_init().


Der Folgezustand ist Register (Bild 4). Hier werden die Pipe-Handles für Input und Output Transfers mit der Funktion AHid_register() erstellt. Das HID Gerät hat keine Interfaces (Interface ID = -1). Weiteren Parameter werden der grafischen Benutzeroberfläche entnommen.

Die Zustandsmaschine wechselt anschließend in den Idle Zustand (Bild 5).

Bild 4: Erstellen der Input- und Output-Pipes mit AHid_register().


Ein Timer sorgt für den gelegentlichen Aufruf der Funktion AHid_find(). Die Überwachung des Verbindungsstatus ist meist unkritisch und kann deshalb alle paar Sekunden erfolgen. Die Demo verwenden hierfür ein Zeit-Intervall von einer Sekunde (Bild 5).

Bild 5: Lesen vom Geräte durch AHid_read() und Überwachung der Verbindung mit AHid_find().


AHid_read() liest Daten vom USB HID Gerät. Zu beachten ist, dass AHid_read() nur Daten fester Größe liest. Die Größe entspricht dabei dem Wert der Report Größe, der schon beim Aufruf von AHid_register() verwendet wurde.

Die eigentliche Übertragung erfolgt in zwei Schritten. Zunächst sammelt die AHid.dll alles was vom Gerät gesendet wird. Hierfür wird von der AHid.dll ein eigener Thread gestartet der die empfangenen Daten zwischenspeichert. Bei Aufruf von AHid_read() werden diese dann an die Anwendung weitergegeben.

Das Senden an das HID Gerät erfolgt durch die Funktion AHid_write() (Bild 6).

Auch hier ist zu beachten, dass AHid_write() nur Daten fester Größe versendet. Die Größe entspricht dabei dem Wert der Report Größe, der schon beim Aufruf von AHid_register() verwendet wurde.

Bild 6: Daten senden mit AHid_write().


Die Anwendung wechselt ständig zwischen den Zuständen Idle und Write. Solange bis durch erneutes Drücken des Buttons Connect die Schleife verlassen wird. Vor Beenden der Anwendung wird noch der Zustand Deregister ausgeführt (Bild 7).

Bild 7: Freigabe von Speicher in der AHid.dll durch Aufruf von AHid_deregister().


Die Verbindung zwischen USB HID Gerät und der AHid.dll ist hiermit unterbrochen. Das Schließen der Handles und die Freigabe von Speicher erfolgt in der Funktion AHid_deregister().