USB HID unter Windows Console

OP Persönliche Seite #4733442
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 ?
Angehängte Dateien:
OP Persönliche Seite #4733471
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)
OP Persönliche Seite #4733616
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.
#4733649
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...
Gast #4734864
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
OP Persönliche Seite #4747020
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.
#4749753
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
OP Persönliche Seite #4750619
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren