Forum: Mikrocontroller und Digitale Elektronik Serielle Schnittstelle über Serial-USB-Converter auslesen (windows)


von Sabine M. (sabine_m)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin ein totaler Noob, was Schnittstellenprogrammierung angeht. Ich 
muss jetzt aber für ein Uni-Projekt Daten aus einem Gerät mit serieller 
Schnittstelle auslesen (bulk-transfer)(unter Windows 7 x86).

Lagebeschreibung:
Gerät hat serielle Schnittstelle und ist über einen serial-usb-converter 
an den Pc angeschlossen.

Mein Prof hat vorgegeben, dass wir WinUsb als API verwenden, 
Programmiersprache ist C/C++.
Bis zu der Stelle, an der ich Daten auslesen möchte klappt das auch ganz 
gut.
Die Informationen die ich vom Device-Descriptor etc bekomme, sieht man 
im angehängten Bild.
Das Problem ist jetzt nur, dass ich nicht weiss, wie ich die Daten 
auslese.

Genauer: ich bekomme den Fehlercode 121 beim Aufruf von WinUsb_ReadPipe.
Nachdem ich gegoogelt habe, weiss ich, dass es ein Timeout ist...gelesen 
werden auch 0 Bytes. Hochsetzen des Timeouts auf 20sec hat leider auch 
nichts gebracht...ich vermute einfach mal, dass in der Pipe nichts 
steht.

Zu Testzwecken haben wir ein ähnliches Gerät mit USB-Schnittstelle, 
welches direkt an den Pc angeschlossen werden kann. Ich habe daher ein 
2. Programm geschrieben, welches komischerweise funktioniert.

Nun zu meiner Frage:
1. muss ich irgendwo in meinem Programm auch sowas wie die Baud-Rate, 
etc setzen? und falls ja, wo?
2. wie bringe ich der winusb-api bei, dass hinter dem USB-Port eine 
serielle Schnittstelle sitzt?

Es tut mir Leid, dass es alles etwas verworren klingt, aber ich bin mit 
der Seriellen Schnittstelle etwas überfordert.

Vielen Dank schonmal,

Sabine

von Εrnst B. (ernst)


Lesenswert?

Sabine M. schrieb:
> 1. muss ich irgendwo in meinem Programm auch sowas wie die Baud-Rate,
> etc setzen? und falls ja, wo?

Jein. Aber zuerst musst du so ziemlich alles neu nachprogrammieren, was 
der entsprechende USB-Seriell-Treiber schon mitbringen würde.

> 2. wie bringe ich der winusb-api bei, dass hinter dem USB-Port eine
> serielle Schnittstelle sitzt?

Garnicht. Den Teil musst DU programmieren. Dazu brauchst du genaue 
infos über den Wandler-Chip, der auf dem USB->Rs232-Wandler verbaut ist.

oder anders ausgedrückt:

Sabine M. schrieb:
> Mein Prof hat vorgegeben, dass wir WinUsb als API verwenden.

ist Blödsinn. Lass den zum serial-usb-converter gehörenden Treiber seine 
Arbeit machen, und verwende den von ihm zur Verfügung gestellten 
Comport.

von Sabine M. (sabine_m)


Lesenswert?

ok...klingt ja noch schlimmer als ich befürchtet hatte. :(


Ich habe vom Lehrstuhl nur das "Kabel" bekommen. Wäre es sinnvoll, mir 
ein neues Serial-Usb-Konverter-Kabel zu kaufen, so dass ich den genauen 
Typ weiss?

Kannst du mir kurz die Vorgehensweise erläutern?

von Peter II (Gast)


Lesenswert?

Sabine M. schrieb:
> Ich habe vom Lehrstuhl nur das "Kabel" bekommen. Wäre es sinnvoll, mir
> ein neues Serial-Usb-Konverter-Kabel zu kaufen, so dass ich den genauen
> Typ weiss?

nein, es reicht den Treiber zu installieren. win7 müssten ihn eigentlich 
im Internet finden. Sonst wird doch wohl noch ein Hesteller auf den 
Kabel stehen? Oder einfach mal unter linux anstecken, dann müsste man 
rausbekommen welchen Treiber man braucht.

von Sabine M. (sabine_m)


Lesenswert?

Ok, super danke.
Gesetzt den Fall der Treiber gibt mir dann den Com-Port 8, mit welcher 
API spreche ich ihn an? Kannst du mir da etwas empfehlen?

von Εrnst B. (ernst)


Lesenswert?

Peter II schrieb:
> nein, es reicht den Treiber zu installieren. win7 müssten ihn eigentlich
> im Internet finden.

Eben nicht, wenn man sich wort-wörtlich an die Anforderungen des Profs 
hält.
Wenn nämlich der Treiber installiert ist, greift sich der Treiber das 
Gerät, und du hast keine Chance mehr an dem Treiber vorbei direkt 
mittels WinUSB mit dem Gerät zu kommunizieren.
Also eher: Treiber deinstallieren, falls einer installiert ist.

Sinnvoll ist das natürlich nicht, außer der Vorlesungstitel ist 
"Usermode-Devicetreiber-Programmierung"

von Martin S. (panik)


Lesenswert?

Der Typ ist egal solange das Kabel erkannt wird.

1. Stecke den Adapter in einen USB-Port und schaue im Gerätemanager nach 
welcher COM-Port für dein Kabel verwendet wird.
2. Nimm Putty und schalte es auf seriell um mit dem COM-Port deines 
Kabels aus Pkt.1 und wähle die Geschwindigkeit z.B.9600
Im Consolen-Fenster kannst du jetzt die Datesn sehen und mittels 
Tastatur eigene Daten senden.

Gruß Martin

von Sabine M. (sabine_m)


Lesenswert?

oh...ich habe mich etwas ungenau ausgedrückt. Das Gerät sendet 
Mess-Daten, welche ich graphisch darstellen muss. Das Frontend etc ist 
auch komplett fertig und funktioniert auch (allerdings gerade nur unter 
"normalem" USB).

Ich brauche quasi eine API die ich in mein Programm einbetten kann. 
Zusätzliche Software wie Putty etc darf/kann ich da leider nicht 
verwenden.

von Εrnst B. (ernst)


Lesenswert?

Martin S. schrieb:
> Der Typ ist egal solange das Kabel erkannt wird.

Nicht, wenn man den Treiber selber programmieren soll....

Sabine M. schrieb:
> Gesetzt den Fall der Treiber gibt mir dann den Com-Port 8, mit welcher
> API spreche ich ihn an? Kannst du mir da etwas empfehlen?

CreateFile/SetComState/ReadFile/WriteFile
oder halt schöner verpackt:
http://www.robbayer.com/files/serial-win.pdf
http://www.codeproject.com/KB/system/serial.aspx

(willkürliche Google-Hits ;) )

von Sabine M. (sabine_m)


Lesenswert?

ok super danke.

irgendwie bin ich inzwischen total verwirrt :(

Aufgabenstellung ist:
Gegeben Device A, serielle Schnittstelle, Serial-Usb-Converter

Ziel: Lesen Sie die Messdaten innerhalb Ihres Programms aus dem Gerät 
aus und stellen Sie diese graphisch dar. Verwenden Sie keine weitere 
Software.

Ich muss dieses Gerät eigentlich nur ansprechen können, irgendwie an 
meine Daten kommen und bin quasi zufrieden.

von Εrnst B. (ernst)


Lesenswert?

Ok, also keine WinUSB Anforderung. Gut. Vergiss alles dazu.

Deine Software benutzt einfach die serielle Schnittstelle. Ob da ein 
USB-Wandler dazwischenhängt oder nicht, braucht dich nicht 
interressieren. Aus deiner Sicht ist es einfach ein Serieller Port.

von Sabine M. (sabine_m)


Lesenswert?

aber echt vielen, vielen dank für die hilfe...ich setz mich dann mal mit 
http://www.robbayer.com/files/serial-win.pdf auseinander.

ich werd mich wahrscheinlich in ein paar tagen wieder melden, wenn ich 
das nächste mal verzweifle. :)

von Christian R. (supachris)


Lesenswert?

WinUSB funktioniert vielleicht nicht mal, denn dann müsstest du erst mal 
vom Hersteller des Kabels Informationen bekommen, wie zum beispiel die 
Baudrate gesetzt wird, wie die Daten eventuell noch in den Pipes 
verpackt sind, wie Puffergrößen eingestellt werden usw.
Aus der Aufgabenstellung geht nicht hervor, dass du den zum Kabel 
gehörigen Treiber nicht verwenden sollst. Du sollt offenbar lediglich 
die Daten auslesen und darstellen, also über den virtuellen COM Port. 
Wenn das mit dem COM Port zu unelegant ist, gibts auch zur Kommunikation 
mit dem USB-Serial Adapter APIs des Herstellers, jedenfalls bei FTDI und 
Silabs. Prolific sicher auch, und viel was anderes wird der Adapter 
nicht sein. Da kannst du das API dann in deine Anwendung einbetten.

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.