Forum: PC-Programmierung USB HID unter Windows Console


von Rene B. (themason) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi Leute ...

ich hab mal ne Frage zum Thema USB-Programmierung unter Windows.
Ich habe mit einem PIC32 und dem Harmony Tool nebst Hardware ein USB-HID 
Device. Ich habe mich dabei son bissl an die Demos gehalten. Nun hat der 
Uwe Berger unter seiner Homepage ein Tool Namens USB-HID Terminal mit 
dem ich testhalber Daten zu dem Gerät schicken kann bzw von diesem 
empfangen kann. Er benutzt die "SLABHIDDevice.dll" von Silicon Labs zu 
der ich auch schon App Notes usw gefunden habe.
Nun zu meinem Problem ...

ich will unter einer ganz ordinären Windows-Konsole OHNE GUI und 
Nachrichten Queue Daten senden bzw empfangen. Geht das ?
Ich hab die "SLABHIDDevice.dll" schon in meinem einfachen C Programm 
eingebunden und finde auch das Gerät (wenn es eingesteckt ist oder eben 
nicht), kann es öffnen und allerlei Infos abfragen (HID-Name usw). Geht. 
Was nicht geht ist die Benutzung der Funktionen zum senden und Empfangen 
von Daten. Ich benutze die HidDevice_SetOutputReport_Interrupt 
Funktionen (wie in der AN492), und es kommt nichts bei meinem Gerät an. 
Beim Senden erhalte ich immer den Fehler HID_DEVICE_TRANSFER_FAILED.

Kann es vielleicht sein das ich USB generell nicht ohne Nachrichten 
Queue bzw GUI laufen lassen kann ? Ich benutze keine weiteren Threads 
bzw Handles im Windows-Sinne. Kann man überhaupt USB-Geräte ansprechen 
nur mit dieser DLL ohne GUI ? Ich möchte mir das ganze 
Event-Nachrichtenverabeitungsgedöns unter Windows sparen und einfach nur 
mit einer "einfachen" Schleife Daten an das Gerät Senden bzw von diesem 
Empfangen, nach möglichkeit unter "nacktem" C ohne viel tam tam drum 
herum. Ist das möglich ?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Rene B. schrieb:
> Kann es vielleicht sein das ich USB generell nicht ohne Nachrichten
> Queue bzw GUI laufen lassen kann ?

Sehr unwahrscheinlich.

> Ich benutze die HidDevice_SetOutputReport_Interrupt Funktionen (wie in
> der AN492),

Link? Google findet unter "silabs an492" nichts zielführendes.

Hast Du Dir mal AN532 angesehen?

von Rene B. (themason) Benutzerseite


Lesenswert?

Oh sorry ... da haben mir meine Wurstfinger nen Streich gespielt.

Ich meinte AN 249

http://www.silabs.com/products/mcu/Pages/ApplicationNotes.aspx

Ich bin mir auch nicht sicher ob der Uwe Berger dieses Demo als Basis 
genommen hat, aber angesichts der relativ wenigen Funktionen der DLL 
(beschrieben in der AN 532, aus der ich die lib und h habe) bleiben da 
nicht mehr viele Möglichkeiten.
Müsste das ganze denn nicht auch ohne Nachrichten-Queue gehen einfach 
Daten zu senden ? (nur damit ich weiß das ich nicht ganz auf dem Holzweg 
bin)

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wo siehst Du in der Headerdatei zur DLL irgendwo die Notwendigkeit, 
Fensterhandles/Messagequeues anzugeben?

von Rene B. (themason) Benutzerseite


Lesenswert?

Direkt hab ich's nirgendwo gesehen. Aber in dem Beispiel AN 249 wird die 
dll registriert (deshalb wohl auch die GetGUID funktion im header). Und 
für das registrieren der DLL braucht man ein Window handle meine ich. In 
der angehängten Main.c hab ich mal meine "Versuche" per USB was zu 
senden mal festgehalten. Alles bis auf die sendefunktion klappt ja. Nur 
bei dieser kommt immer fehlercode 5 zurück. "Ungültige Parameter". Aber 
ich übergebe ja nur das USB device (vom öffnen) die ermittelte größe des 
Output buffers und den buffer den ich senden will.

von Volker S. (vloki)


Lesenswert?

In den MCHP Beispielen der MLA (Microchip Libraries for Applications für 
8-16 Bit PICs) wird teilweise die HIDAPI von Alan Ott verwendet. 
http://www.signal11.us/oss/hidapi/

Ich habe die selber auch in einer GUI (HID Terminal 
http://www.hs-ulm.de/nocache/wir/Personal/PersonalSaSchr/vschilli/QtProjekte/) 
verwendet, aber ich kann mir nicht vorstellen, dass das nicht auch in 
der Konsole gehen soll. Direkt auf der oben verlinkten Seite schient ein 
Beispiel zu sein...

von Pit (Gast)


Lesenswert?

Rene B. schrieb:
> "Ungültige Parameter". Aber
> ich übergebe ja nur das USB device (vom öffnen) die ermittelte größe des
> Output buffers und den buffer den ich senden will.

Na dann wirds wohl am Device oder der Größe Deines Output Buffers 
liegen.
Das Device selber wird ja vermutlich auch mit einer ganzen Menge 
Parameter initialisiert. Vlt. sind ja die falsch.

Gruß Pit

von Timmo H. (masterfx)


Lesenswert?

Welcher Silabs ist das. Habe schon ein paar Programme für den CP2110 
geschrieben unter Verwendung von SLABHIDtoUART in Plain C. Bisher ohne 
Probleme, sowohl Konsole als auch GUI (via WinApi)

: Bearbeitet durch User
von Rene B. (themason) Benutzerseite


Lesenswert?

Sorry das ich mich erst jetzt wieder melde, war ein weilchen offline.

@Timmo

ich nutze gar keinen Silabs Chip. Ich habe von Microchip den PIC32MX per 
USB angekorkt. Als Framework nutze ich das Harmony und habe eine 
Beispiel-Applikation von denen zum laufen gebracht. Es gibt Quellcode 
für den PIC32 sowie ein kleines Test-Programm mit denen man eine LED 
toggeln kann und einen taster abfragen kann. Mit diesem PC-Programm kann 
ich per USB-HID Pakete zu meinem PIC schicken. Das Problem ist nur das 
es dazu keinen Quellcode gibt. Ähnliches bei dem HID-Terminal von Uwe 
Berger auf der mikrocontroller.bplaced.net Seite. Mit diesem Programm 
kann ich die zu sendenden Daten schon näher spezifizieren und es kommt 
auch was in meinem PIC an bzw kann vom PIC aus Daten zurückschicken. Nur 
leider gibt es da auch keinen Quellcode zu. Mit Quellcode meine ich nur 
die PC-Seite. Die PIC Seite scheint einwandfrei zu funktionieren (Gerät 
wird erkannt, Descriptoren kann ich mit USB-Viewer anzeigen lassen, und 
halt die beiden genannten PC-Programme), nur das ich selbst halt kein 
PC-Programm erstellen kann wo ich ein Datenpaket senden und empfangen 
kann.

@Pit

Soweit war ich auch schon. Ich habe auch die Funktion die mir die Größe 
der Puffer zurückgibt benutzt, und die zurückgegebene Größe stimmt auch 
(64 Byte + 1). Nur beim Aufrufen der SetFeature_Interrupt bekomme ich da 
auch den Fehler das die Parameter nicht stimmen.
Ich will nicht ausschließen das im Device noch etwas falsch eingestellt 
ist. Wobei das eigentlich direkt vom Demo ist was ja auch funktioniert, 
bzw da ich dieselbe DLL wie Uwe in seinem Funktionierenden HID-Terminal 
Programm benutze weiß ich nicht wie wahrscheinlich eine 
Fehlkonfiguration meinerseits ist wenn es mit seinem Programm 
funktioniert. Sprich : Wenn der USB beim PIC falsch konfiguriert ist 
dürfte das HID-Terminal Programm ja auch nicht funktionieren, was es 
aber tut.

Die anderen Links muß ich mir mal genauer anschauen. Aber ich kann mir 
nicht vorstellen das das so schwer sein kann bzw wo genau der Fehler 
sein könnte. Bin ein wenig am Ende mit meinem begrenzten Latein.

von Rene B. (themason) Benutzerseite


Lesenswert?

Kleines Update :

@Volker

Dein HID-Terminal bzw HID-QT Programm funktioniert ebenfalls. Das was 
mein PIC per USB rausspuckt sehe ich 1:1 in deinem Terminal Fenster.
Also allmählich schließe ich einen Fehler auf PIC Seite aus.
Jedenfalls bei 3 funktionierenden PC-Programmen.

von Blubb (Gast)


Lesenswert?

Rene B. schrieb:
> bei 3 funktionierenden PC-Programmen.

Erst bei 4 funktionierenden "PC-Programmen" kannst du den PIC außer Acht 
lassen :p
</irnoe oft>

von Volker S. (vloki)


Lesenswert?

Rene B. schrieb:
> Kleines Update :
> @Volker
>
> Dein HID-Terminal bzw HID-QT Programm funktioniert ebenfalls.
Sourcecode muesste auch auf der Seite zum Runterladen verfügbar sein.

Von dem MCHP Beispiel müsste eigentlich auch der Sourcecode in den MLA 
enthalten sein.
(Aber du benutzt ja Harmony)

: Bearbeitet durch User
von Pit (Gast)


Lesenswert?

Rene B. schrieb:
> (64 Byte + 1)

Und wieviel gibt das jetzt?

a) 65 Byte oder
b) 64 Byte und 1 Apfel?


Dass Dein PIC nur 64 Byte 'versteht' weisst Du aber schon, oder?

von Volker S. (vloki)


Lesenswert?

Pit schrieb:
> Dass Dein PIC nur 64 Byte 'versteht' weisst Du aber schon, oder?

65 kann schon stimmen. Das erste wird wohl die "report number" sein, wie 
in dem Beispiel zur HIDAPI:
1
#ifdef WIN32
2
#include <windows.h>
3
#endif
4
#include <stdio.h>
5
#include <stdlib.h>
6
#include "hidapi.h"
7
8
#define MAX_STR 255
9
10
int main(int argc, char* argv[])
11
{
12
  int res;
13
  unsigned char buf[65];                 <<<<<<<<<<<<<<
14
15
...
16
17
  // Toggle LED (cmd 0x80). The first byte is the report number (0x0).
18
  buf[0] = 0x0;                    <<<<<<<<<<<<<<
19
  buf[1] = 0x80;
20
  res = hid_write(handle, buf, 65);
21
...
Der Link weiter oben scheint gerade nicht zu funktionieren.
Alternativ: https://github.com/signal11/hidapi

von Rene B. (themason) Benutzerseite


Lesenswert?

@Volker


Danke ... das war der entscheidende Hinweis.
Ich hab das erste Byte nicht initialisiert. :-S
Ich hatte da noch dunkel was in Erinnerung.

>  buf[0] = 0x0;                    <<<<<<<<<<<<<<

Das wars.


Nun muss ich unter meiner Konsole nur noch das lesen hinbekommen ;-) 
Aber das dürfte nun auch weniger problematisch sein. Hoffe ich mal :D


Vielen Dank dir.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.