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 ?
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?
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
Wo siehst Du in der Headerdatei zur DLL irgendwo die Notwendigkeit, Fensterhandles/Messagequeues anzugeben?
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.
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...
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
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
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.
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.
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>
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
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?
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.