Hallo Microcontroller, habe von USB - Programmierung eigentlich relativ (wobei relativ noch übertrieben ist) wenig Ahnung. Möchte jetzt in meiner Software die Kommunikation mit einem USB Barcodescanner einbauen. Ich entwickle unter .NET und habe mir jetzt die SharpLibUSB besorgt. Ist eine Wrapper-Klasse für die LibUSB Win32. Es funktioniert auch eigentlich alles soweit so gut. Was ich jetzt aber nicht ganz verstehe, ist wie ich mit dem Gerät kommunizieren soll. Ich kann über die Methode, soweit ich das verstehe, BulkRead(int Endpoint, byte[] bytes) vom Gerät lesen. Ich nehm einmal an, dass der Endpoint entweder der Entpoint ist, von dem oder bis zu dem gelesen werden soll. ABER: Jetzt kommt die große Frage, woher weiß ich, was ich hier für Werte eintragen soll. Suche verzweifelt nach Dokumentationen. Oder gibt es da eine andere Möglichkeit zu wissen, welcher Endpoint was ist? Vielen Dank für Eure Hilfe Paulchen29
Hallo! Danke für Deine Antwort. Ich denke Du meinst www.sprut.de. Da war ich gerade, finde aber nur Dokumentationen zu PIC's. Oder meinst Du eine andere Seite! Danke Paulchen29
Okay - sorry tut mir leid! Habe jetzt nochmal rumgestöbert und bin auf Spruts doch noch auf eine sehr schöne USB-Dokumentation gestoßen. Danke schön!
Naja, ohne zu wissen, was der BarcodeScanner im IN-EndPoint zu Verfügung stellt, und welche Kommandos du an den oder die OUT-Endpoints schicken musst, damit der arbeitet, kannst du eh nicht mit ihm kommunizieren. Oder hast du da eine Doku?
Hallo Christian! Wenn ich erstmal an die Daten rankomme wäre ich schon sehr zufrieden. Ich habe früher einen SerialPort Scanner gehabt und hoffe, dass die Datenstreams gleich sind. Deswegen wollte ich erstmal die OUT-Endpoints (muss ja nur lesen) jetzt durchgehen und hoffen, dass ich etwas verwertbares finde. Was ich aber noch fragen wollte: In der Doku von Spruts steht, dass jedes Interface ein oder mehrere Endpoints haben kann. Kann es sein, dass im Endpoint 0 zufällig auch steht, wieviele Endpoints da sind. Oder kann man das nur über den Hersteller erfahren.
Endpoint 0 ist quasi der Konfigurationsendpoint. Über ihn läuft die Enumeration, Konfiguration, etc. Das heisst, über ihn werden auch die Deskriptoren gesendet, anhand derer der Host das Gerät identifizieren kann. Nach einem Gerät sucht man für gewöhnlich über VID/PID oder den Bezeichnungsstring. Kennst du diese Angaben, sollte es kein Problem sein, eine Kommunikation aufzubauen. Wie ist der Barcode-Scanner in der Systemsteuerung hinterlegt? Über einen virtuellen COM-Port oder als Eingabegerät(HID)? Ralf
1. Die Zahl der Endpoints findest du in den Descriptoren. Wenn du das Gerät öffnest, eine Konfiguration auswählst, ein Interface auswählst und das nimmst, dann kannst du dir die Anzahl und die Art der EPs anzeigen lassen. Macht die LibUSB alles für dich. 2. OUT und IN Bezieht sich auf PC-Sicht. Aus dem PC heraus an das Gerät ist OUT, was das Gerät bereit stellt, ist IN. 3. Du stellst dir das eventuell bissl einfach vor. Bei USB ist es immer ein Master-Slave Prinzip. In den allermeisten Fällen stellt das Device ohne Aufforderung überhaupt keine Daten in die IN Endpoints. Diese werden durch Kommandos erst mal angefordert. Mit viel Glück macht das dein Scanner anders, glaub ich aber eher nicht. Bei HID Geräten ist es etwas anderes, kommen die Daten meist so rausgepurzelt, weil sich der Windows Treiber da drum kümmert.
Die Anzahl, Typ, Richtung und Größe der Endpoints stehen im Interface-Deskriptor. Mit USBView kannst du dir die Deskriptoren anzeigen lassen. Grüße
Nachtrag/Erweiterung: In den Deskriptoren steht u.a., wieviele IN/OUT Endpoints da sind. Es gibt ein paar Sniffer-Tools (auch Freeware), die den Datenverkehr aufzeichnen können oder dir genauere Daten über angeschlossene Geräte liefern können. Guck mal bei USB.org Ralf
Hallo, vielen Dank für Eure zahlreichen Antworten! Ihr habt mir schonmal sehr viel weiter geholfen! @Christian: Ich denke man lebt im Jahre 2009 - im Zeitalter der 4GL Sprachen - wozu muss ich mich da noch um irgendwas kümmern! ;-) Nein, Spass beiseide. Das habe ich mich auch schon gefragt, aber ich hoffe darauf, dass wenn man mit dem Scanner scannt ein Endpoint mit Informationen gefüllt wird. Oder stell ich mir das wirklich zu leicht vor?
Hallo, dank der genialen Seite von Sprut und Eurer tollen Beiträge bin ich jetzt schon etwas mehr mit USB konform. Danke dafür. Ich teste gerade mit meinem Handy, welches ich als Massenspeicher angeschlossen habe, da ich noch keinen BarCode Scanner zum testen bekommen habe. Jetzt habe ich aber folgendes Problem. Ich kann das Handy über VendorID und ProductID identifizieren. Ich kann den Device öffnen. Bloß wenn ich jetzt die Konfiguration setzten will schmiert er mir weg. Ich programmiere mit der SharpUSBLib, welche ein Wrapper für die LibUSB Win32 ist. In letzterer Dokumentation steht, dass wenn man die Konfiguration auf -1 setzt, dann bleibt das Device im unkonfigurierten Status. Das Problem ist bei dem Aufruf: device.SetConfiguration(-1); bekomme ich folgende Exception: usb_set_configuration: could not set config -1: win error: Falscher Parameter. while calling usb_set_configuration return code: -22 Leider verstehe ich es nicht so ganz und hoffe, dass mir jemand von Euch erklären kann, was ich falsch mache! Vielen Dank im Voraus Jürgen
Hallo Christian, stand halt so in der Dokumentation. Leider habe ich dafür zuwenig Ahnung. Aber wenn ich 0 verwende geht es zwar, doch dann habe ich das nächste Problem, dass ich bei: device.ClaimInterface(0); //auch bei >0 folgende Exception bekomme: usb_claim_interface: could not claim interface 0, invalid configuration 0 while calling usb_claim_interface return code: -22 Also jetzt behauptet er, dass ich eine falsche Configuration habe. Deswegen dachte ich, dass ich vielleicht die Configuration auf -1 setzte.
Ich glaub nicht, dass du -1 setzen kannst. Wird eher nur lesbar sein, um dir den Zustand mitzuteilen. Bin aber nicht sicher... Ralf
Es wurde zwar hier schon mal angedeutet: Beitrag "Re: USB Programmierung" aber niemand ist drauf eingegangen wenn ich das richtig überflogen habe. Normalerweise arbeitet ein Barcodescanner als HID. Er verhält sich genauso wie eine Tastatur. Also statt irgendwas einzutippen drückt man auf den scanner und der tippt einem den Klartext ein. Ich denke ihr macht euch das Leben viel zu schwer.
Hallo Willi, so, jetzt hast Du mich total um den Verstand gebracht! ;-) Darf ich mal fragen wohin er den Klartext "tippt"? Falls es etwas unklar von mir beschrieben wurde: Ich will, dass der Scanner seinen "Inhalt" an mein Programm schickt. Liebe Grüße und einen schönen Abend Jürgen
Ich kenne nur Barcodescanner die sich als HID am PC anmelden. Mach mal ne Textdatei auf und Scan einen Barcode. Normalerweise müsste der Klartext des Barcodescanners in die Datei geschrieben werden, genauso wie wenn du ihn über die Tastatur eingeben würdest. In deinem Programm kannst du dann einfach den Barcode abfangen genauso wie du eine Eingabe der Tastatur abfängst.
> Darf ich mal fragen wohin er den Klartext "tippt"?
Genau dorthin, wo auch Tastendrücke der Tastatur landen, unter Windows
also im Fenster, das gerade den Eingabefocus hat.
Ah! Muss ich mal probieren! Habe leider noch kein Testgerät - hört sich aber logisch an! Danke schön
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.