Forum: Mikrocontroller und Digitale Elektronik USB Datenübertragung (Hilfe)


von Ben R. (Firma: Explinovo GmbH) (exi)


Lesenswert?

Hallo,
ich habe ein kleines Problemchen.
Gerade beschäftige ich mich mit dem PIC 18F4550 und wollte nun eine
Verbindung über USB zum PC herstellen.

Ich habe alle Deskriptoren geschrieben und die Enumeration scheint gut
zu funktionieren oder zumindest das Gerät wird im Gerätmanager als HID
angezeigt.

Jetzt möchte ich Daten an Geräte senden und empfangen. Dazu habe ich ein
Programm in Visual C++ geschrieben (Microsoft Visual Studio 2009).
Ich habe vieles in Foren gelesen und was ich verstanden habe ist daß es
mit den Funktionen ReadFile(...) und WriteFile(...) vollkommen
ausreicht,  leider sende und empfange ich nichts.
Deswegen glaube ich, dass ich noch etwas falsch mache.
Inzwischen bin ich auf die WDK (früher DDK) gestoßen.
Aus dieser Library benutze ich die Funnktionen
HidD_GetInputReport(...)zum empfangen und HidD_SetOutputReport(...)zum
senden.
Ich habe die Dateien HID.h und HIDSDI.h hinzugefügt, aber jetzt es
kompiliert nicht mehr. Ich kriege immer:

***
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""unsigned
char __stdcall HidD_GetInputReport(void *,void *,unsigned long)"
(?HidD_GetInputReport@@YGEPAX0K@Z)" in Funktion "_main".
***

Muss ich DDK oder WDK Librarys benutzen?
Hat jemand schon so ein Problem gehabt? Habt Ihr  Ideen woran es liegen
könnte? Ich befürchte das es an dem Report Deskriptor liegt... Was
glaubt ihr??
Vielen Dank für jede Antwort!

von Εrnst B. (ernst)


Lesenswert?

DDK ist das Device Driver Development Kit, d.H. wenn du Code daraus 
verwendest, muss dein Programm nachher auch als Treiber compiliert 
werden und laufen, und nicht mehr als normale Anwendung. Vermutlich 
nicht was du willst.

von hk (Gast)


Lesenswert?

Vieleicht hilft dir das hier ein wenig weiter:

http://www.holger-klabunde.de/usb/usbpic.htm

>mit den Funktionen ReadFile(...) und WriteFile(...) vollkommen

Ja, das geht. Das Problem ist an das HID Handle ranzukommen.
Ziemlich komplizierter Kram. Auf der Seite oben findest du
C-Quellcode (kein C++) für VC5 und einen Zugriff auf PIC16C765
per HID. Aber frag mich bloß nicht was ich da gemacht habe ;)
Ist schon sehr lange her das ganze. Heute nehme ich eigentlich
nur noch CDC Devices. Ist einfacher.

von René K. (king)


Lesenswert?

Ben R. wrote:
> ***
> error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""unsigned
> char __stdcall HidD_GetInputReport(void *,void *,unsigned long)"
> (?HidD_GetInputReport@@YGEPAX0K@Z)" in Funktion "_main".
> ***
>
> Muss ich DDK oder WDK Librarys benutzen?

Na aber sicher doch. Die große Überraschung: Die Library heißt hid.lib. 
:-)

Das wird Dein Problem aber sicherlich nicht lösen. Ein Klassiker ist das 
vergessen der ReportID. Selbst wenn Du damit nicht arbeitest, muss der 
Report ein Byte länger allokiert werden und das erste Byte des Reports 
auf 0 gesetzt werden, vor dem Aufruf von ReadFile oder WriteFile.

Ansonsten sind Fehlerbeschreibungen wie "leider sende und empfange ich 
nichts" nicht gerade hilfreich beim Eingrenzen des Problems. Zumindest 
den Error-Code hättest Du uns verraten können (siehe GetLastError).

von René K. (king)


Lesenswert?

Ernst Bachmann wrote:
> DDK ist das Device Driver Development Kit, d.H. wenn du Code daraus
> verwendest, muss dein Programm nachher auch als Treiber compiliert
> werden und laufen, und nicht mehr als normale Anwendung. Vermutlich
> nicht was du willst.

Die hid.dll ist für den User-Mode gedacht. Da Header und Import-Lib nur 
im WDK enthalten sind, ist es sehr wohl das, was er braucht. Und ohne 
dem ist HID Entwicklung unter Windows nicht gerade eine Freude, da Du 
ohne dem nicht an im HID gespeicherte Strings herankommst, da Du nicht 
an den Feature-Report herankommst, da Du nicht an VID/PID des Gerätes 
herankommst...

von René K. (king)


Lesenswert?

hk wrote:
> Ziemlich komplizierter Kram.

Nur ungewohnt, aber ganz und gar nicht kompliziert.

> Ist schon sehr lange her das ganze. Heute nehme ich eigentlich
> nur noch CDC Devices. Ist einfacher.

Naja, wenn ich bedenke, dass ich noch extra eine INF-Datei mitschleppen 
muss, um mich an usbser.sys zu binden, empfinde ich das nicht gerade als 
einfach. War da nicht etwas unter Vista64, dass soetwas ohne Signierung 
einfach ablehnt? Bei HIDs hingegen brauchst Du nichts zu machen, das 
funktioniert einfach.

Desweiteren hatte ich beim letzten Mal so meine liebe Not, mein CDC zu 
finden, zusammen mit der Port-Nummer. Dann habe ich keine 
WM_DEVICECHANGE-Message erhalten, da usbser.sys scheinbar kein 
GUID_DEVINTERFACE_COMPORT registriert. Dann komme ich an die im Gerät 
gespeicherten Strings nicht so ohne weiteres heran usw..

Da freue ich mich doch jedesmal, wenn ich an HIDs arbeiten darf. 
Einfacher geht es doch fast gar nicht. Und ich brauche den Usern 
nichtmal zu erklären, was ein COM-Port ist. :-)

Unterm Strich ist das aber wohl ganz einfach nur eine Frage des 
persönlichen Geschmacks.

von Felix N. (time2ride)


Lesenswert?

Gibt es nicht irgendwo ein schönes How-To, in dem genau steht, was man 
an dem ATmega machen muss, und was in einem Programm für den PC stehen 
muss, damit ein reiner Datenaustausch funktioniert? Das wird ja wohl 
immer das selbe Schema sein...

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Vielleicht findest Du in Deinem Doppelposting ja die Antwort:

Beitrag "HID device IN Report mit ReadFile empfangen"

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.