Hallo zusammen,
nachdem ich mittlerweile schon eine ganze Weile probiere und suche, aber
nichts vernünftiges zu Weg gebracht habe, wende ich mich an euch:
Was ich vor habe:
Ich möchte über C# auf ein HID Gerät zugreifen, an dieses Daten senden,
um dort einige Leuchtdioden zu steuern. Es müssen lediglich 4Byte
gesendet werden um dies zu realisieren.
Jetzt meine Probleme:
- Wie erkenne ich welche HID Geräte angeschlossenen sind? Hier wäre mir
am liebsten eine Liste aller angeschlossenen HID Geräte (mit VID und PID
etc.) zu erhalten, sodass man anhand dieser Liste das betreffende Gerät
auswählen kann.
- Wie stelle ich eine Verbindung zu dem von mir ausgewählten Gerät her
und übertrage dann die Daten?
am liebsten wäre es mir keine fertigen Treiber zu nutzen sondern die
Umsetzung mit den von Windows zur Verfügung gestellten DLLs zu machen,
sodass mir das ganze von Grund auf klar wird.
Vielen Dank für eure Hilfe!!
Hallo,
auch wenn sich der folgende Artikel mit einer speziellen HID Host
Bibliothek befasst, bei der die Sourcen nicht zugänglich sind, so
findest Du am Ende doch eine schöne Übersicht über frei zugängliche
Treiber. Das wäre ein guter Startpunkt:
http://www.mikrocontroller.net/articles/USB_HID_Host_Treiber
Gruß Potter
Wayne Interessierts schrieb:> Hallo zusammen,>> nachdem ich mittlerweile schon eine ganze Weile probiere und suche, aber> nichts vernünftiges zu Weg gebracht habe, wende ich mich an euch:
google - C# hid
liefert unter den ersten Treffern
http://www.lvr.com/hidpage.htm und
http://www.florian-leitner.de/index.php/2007/08/03/hid-usb-driver-library/
Etwas schwerer zu finden "Microchip Application Libraries"
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en547784
darin enthalten sind unter anderem "Device - HID - Custom Demos" inkl.
der Quelltexte für Firmware und PC-Software.
> Was ich vor habe:> Ich möchte über C# auf ein HID Gerät zugreifen, an dieses Daten senden,> um dort einige Leuchtdioden zu steuern. Es müssen lediglich 4Byte> gesendet werden um dies zu realisieren.>> Jetzt meine Probleme:> - Wie erkenne ich welche HID Geräte angeschlossenen sind? Hier wäre mir> am liebsten eine Liste aller angeschlossenen HID Geräte (mit VID und PID> etc.) zu erhalten, sodass man anhand dieser Liste das betreffende Gerät> auswählen kann.
SetupDiGetClassDevsUM und noch etwas mehr Code
> - Wie stelle ich eine Verbindung zu dem von mir ausgewählten Gerät her> und übertrage dann die Daten?
Wie zu jedem anderen Gerät unter Windows auch
CreateFile, ReadFile, WriteFile
Erklärt wird beides auf den oben verlinkten Seiten.
Vielen Dank für eure Hilfe!
Ich habe mir mal die ganzen Links angeschaut und dabei folgendes zu
Stande bekommen (siehe Anhang).
Somit kann ich jetzt schon mal die komplette ID der angeschlossenen HID
Geräte auslesen.
Aber jetzt habe ich folgendes Problem, ich möchte noch die
Herstellernamen des USB Gerätes ausgeben.
Ich habe es schon mit "SetupDiGetDeviceRegistryProperty" probiert (siehe
Quellcode). Jedoch bekomme ich als Ergebnis irgendwelche komischen
Zeichen geliefert.
Hat irgend jemand eine Idee warum?
Nächster Schritt wäre dann, eine Verbindung zu einem dieser Geräte
herzustellen. Hat jemand einen Befehl, wie ich dabei vorgehen kann?
Vielen Dank!
Wayne Interessierts schrieb:> Vielen Dank für eure Hilfe!>> Ich habe mir mal die ganzen Links angeschaut und dabei folgendes zu> Stande bekommen (siehe Anhang).> Somit kann ich jetzt schon mal die komplette ID der angeschlossenen HID> Geräte auslesen.>> Aber jetzt habe ich folgendes Problem, ich möchte noch die> Herstellernamen des USB Gerätes ausgeben.> Ich habe es schon mit "SetupDiGetDeviceRegistryProperty" probiert (siehe> Quellcode). Jedoch bekomme ich als Ergebnis irgendwelche komischen> Zeichen geliefert.> Hat irgend jemand eine Idee warum?
Mal ins blaue...
SetupDiGetDeviceRegistryProperty muss zweimal aufgerufen werden,
einmal um die nötige Puffergröße zu erhalten, dann, nachdem man Speicher
reserviert hat, um den Wert kopieren zu lassen.
>> Nächster Schritt wäre dann, eine Verbindung zu einem dieser Geräte> herzustellen. Hat jemand einen Befehl, wie ich dabei vorgehen kann?
Wenn mit SetupDiGetDeviceInterfaceDetail der Gerätepfad ermittelt ist,
bekommt man mit
Vielen Dank Arc Net
Deine Tips haben mich sehr viel weiter gebracht!
Ich bin mittlerweile soweit, dass ich alle HID Geräte mit zugehörigem
Herstellernamen anzeigen lassen kann.
Weiterhin kann ich die entsprechenden Files zum schreiben und lesen
erstellen.
Für Tastaturen und Maus kann ich logischerweise nur ein Read File
erzeugen, für mein Gerät ist es jedoch möglich auch das Write File zu
erzugen.
Möchte ich nun 2 Bytes an mein Gerät schicken so bleibt die Variable
result jeweils auf False.
Hier mal der Codeschnipsel:
bool result = WriteFile(ptr, ref test, 2, ref geschrieben,
IntPtr.Zero);
Das komplette Quellcode befindet sich in der Textdatei im Anhang.
Was mach ich da noch falsch?
Vielen Dank für eure Hilfe!
Hallo,
vielen Dank für die Tips.
Ich hab die Anregungen von Arc Net mal übernommen. Jetzt habe ich das
Problem, dass ich das Write File nicht mal mehr erzeugen kann. Ich
erhalte immer eine False zurück.
erzeugt wird es so:
IntPtr ptr = CreateFile(devicepathname, GenericWrite,
FILE_SHARE_READ|FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0,
IntPtr.Zero); //Handle zum Gerät erzeugen
SafeFileHandle writeHandle = new SafeFileHandle(ptr, true);
die ganzen Konstanten wurden so bestimmt:
private const int FILE_SHARE_WRITE = 2;
private const int OPEN_ALWAYS = 4;
private const int INVALID_HANDLE_VALUE = -1;
private const int OPEN_EXISTING = 3;
private const uint GenericRead = 0x80000000;
private const uint GenericWrite = 0x40000000;
Das Read File kann ich weiterhin erzeugen.
Hat noch jemand eine Idee woran es liegen könnte?
Vielen Dank schon mal!
Hallo,
vielen Dank ArcNet!
bei deinem letzten Eintrag waren die passenden Hinweise dabei! Das
erzeugen von Fils und das verschicken der gewünschten Daten klappt jetzt
Prima!
Aber es war letztenendes eine dummer Fehler, der dazu führte, dass ich
das File zum schreiben nicht erzeugen konnte. Ich habe das File, das ich
benötige um die Herstellerdaten (VID, PID, Herstellername
etc.)auszulesen nicht mehr geschlossen.
Aber eine Frage bleibt mir noch offen:
Wo und wie kann ich für folgende Zeile die 3. zu übertragende Variable
(Number of Bytes to write) auslesen um sie als Variable zu übergeben?
Hab es hier mit 3 fest definiert, weil ich es wusste. Aber das muss doch
auch irgendwo aus den Daten ausgelesen werden können.
bool result = WriteFile(writeHandle, test, 3, ref geschrieben,
IntPtr.Zero);
Vielen Dank nochmals für deine Hilfe!