Forum: PC-Programmierung USB Programmierung


von Jürgen M. (paulchen29)


Lesenswert?

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

von Ein (Gast)


Lesenswert?

Hast du schonmal bei Sprut gelesen?

von Jürgen M. (paulchen29)


Lesenswert?

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

von Jürgen M. (paulchen29)


Lesenswert?

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!

von Christian R. (supachris)


Lesenswert?

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?

von Jürgen M. (paulchen29)


Lesenswert?

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.

von Ralf (Gast)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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.

von Mars (Gast)


Lesenswert?

Die Anzahl, Typ, Richtung und Größe der Endpoints stehen im 
Interface-Deskriptor.
Mit USBView kannst du dir die Deskriptoren anzeigen lassen.

Grüße

von Ralf (Gast)


Lesenswert?

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

von Jürgen M. (paulchen29)


Lesenswert?

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?

von Jürgen M. (paulchen29)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

Wieso -1? Die Konfigs fangen bei 0 an, dann kommt 1 usw...

von Jürgen M. (paulchen29)


Lesenswert?

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.

von Ralf (Gast)


Lesenswert?

Ich glaub nicht, dass du -1 setzen kannst. Wird eher nur lesbar sein, um 
dir den Zustand mitzuteilen. Bin aber nicht sicher...

Ralf

von Willivonbienemaya .. (willivonbienemaya)


Lesenswert?

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.

von Jürgen M. (paulchen29)


Lesenswert?

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

von Willivonbienemaya .. (willivonbienemaya)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 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.

von Jürgen M. (paulchen29)


Lesenswert?

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
Noch kein Account? Hier anmelden.