Serielle Kommunikation mit Pi über UART-Bridge zu RS232

  • Hallo liebe Community,

    ich habe ein Messgerät, das seine Messdaten auf Befehl durch einen Kommandostring über RS232 ausgibt, an einen Raspberry Pi 3 angeschlossen.
    Das ganze wurde so realisiert, dass das Messgerät an einer UART-Bridge hängt ( https://www.silabs.com/Support%20Docu…cs/CP2102-9.pdf )
    welche wiederum über Micro-USB am Pi angeschlossen ist.

    Die Bridge wird vom Pi ohne zusätzliche Treiber normal erkannt und hat auch eine Gerätedatei in /dev/ttyUSB0.

    Nun habe ich zwei C-Source Dateien erstellt, eine readdata.c und eine writedata.c


    Mit writedata wird der Kommandostring an das Gerät geschickt, was auch funktioniert (zumindest bekomme ich keine Fehlermeldung).

    Wenn ich nun readdata ausführe, spuckt mir das Terminal jedoch lauter unleserliche Zeichen aus, die in keinerlei Zusammenhang mit den Messwerten stehen.

    Ich habe leider absolut keine Ahnung was ich falsch mache, es wäre super wenn ihr mir da weiterhelfen könntet :)

    Vielen Dank im Voraus

  • Serielle Kommunikation mit Pi über UART-Bridge zu RS232? Schau mal ob du hier fündig wirst!

  • Hallo rasp_newb,

    kannst Du mal Deine beiden Programme posten?

    Was ist die Ausgabe von

    Code
    stty -a -F /dev/ttyUSB0

    Welchen Pegel hat die Ausgabe Deines Messgerätes? Ich frage deswegen, weil der RxD des Raspberry nichts oberhalb von 3,3 Volt mag.

    Welche Art von Daten sendet Dein Messgerät? Sind dies ASCII-Zeichen oder irgendwie kodierte Daten? In letzterem Fall müsste Dein read-Programm die eingelesenen Daten noch auswerten und für die Anzeige aufbereiten.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (3. August 2016 um 23:08)

  • Vielen Dank für eure schnellen Antworten :)
    Hier ist die Aussgabe von stty:

    Code
    speed 9600 baud; rows 0; columns 0; line = 0;
    intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
    eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
    werase = ^W; lnext = ^V; flush = ^O; min = 10; time = 0;
    -parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts
    -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff
    -iuclc -ixany -imaxbel -iutf8
    -opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
    isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
    echoctl echoke

    Die genauen Ausgabepegel weiß ich leider nicht, da keine Dokumentationen über das Gerät verfügbar sind, jedoch dürfte das im 0-5V Bereich liegen (Pegelbereich vom gleichen Messgerät der neueren Generation).
    Dass das über 3,3V sind sollte doch eigentlich kein Problem sein, da das Gerät ja nicht direkt an den Pi angeschlossen ist, sondern an die UART-Bridge.
    Bezüglich der Art von Daten sendet das Gerät eine Antwort im Format +x.xxxxxE+yy_z während _ ein Leerzeichen ist und z ein Stopbit (Bin mir aber leider nicht 100% sicher, da ich wiegesagt keine Dokumentationen zur verfügung habe). Außerdem müsste die RS232 Schnittstelle eine Baudrate von 9600bps und eine 8N1 Konfiguration besitzen.

    Ich hoffe ihr könnt mit diesen spärlichen Infos was anfange, ich freue mich über jegliche Hilfe :)
    Hier sind noch meine beiden c-Dateien.

    http://pastebin.com/nGLSahvc (readdata.c)
    http://pastebin.com/hiHRwKCF (writedata.c)

  • Ja servus,
    so auf den ersten Blick sieht das doch alles schon mal gut aus ...
    Hast Du es mal mit minicom versucht?
    Da kannst Du dann einfach mit den Parametern spielen, bis sie passen.
    Falls es noch nicht instaliert ist, einfach mit apt-get install nachinstallieren.
    cutecom wäre auch eine Alternative ...

    cu,
    -ds-

  • > Dass das über 3,3V sind sollte doch eigentlich kein Problem sein, da das Gerät ja nicht direkt
    > an den Pi angeschlossen ist, sondern an die UART-Bridge.
    Das ist korrekt

    > Die genauen Ausgabepegel weiß ich leider nicht, da keine Dokumentationen über das Gerät
    > verfügbar sind, jedoch dürfte das im 0-5V Bereich liegen
    Wenn das stimmt, dann ist es ein Hardware-Problem.

    Eine Schnittstelle nach RS232 erwartet Pegel von -15V bis +15V. Und alles zwischen -3V und +3V
    ist nicht definiert (Wikipedia-Artikel)

  • Ich hab mal meine writedata.c leicht abgeändert, siehe http://pastebin.com/DW5t4EtQ

    Nachdem das immer noch nichts gebracht hat, habe ich an den Tx Output von der UART-Bridge ein Oszilloskop angeschlossen, und so wies aussieht, liegt hier das Problem.
    Wenn ich writedata ausführe, kann ich auf dem Oszilloskop immer write_buffer[0] als HEX-Value sehen. Jedoch wird write_buffer[1] nur ca bei jeder 15. Ausführung angezeigt.

    Woran könnte das liegen, dass hier nicht der ganze Buffer übermittelt wird?

  • Wie gesagt ... ich würd's erst mal mit minicom oder cutecom probieren. Dann ist eine mögliche Fehlerquelle, nämlich Dein Programm, schon mal ausgeschlossen.
    Es gibt bei tcsetattr() eine Besonderheit: das liefert ok, auch wenn der eine oder andere Wert nicht gesetzt werden konnte. Das solltest Du mal überprüfen.
    Ich hatte da mal ein Beispie, das muss ich aber erst noch suchen.

    cu,
    -ds-

  • Ich hab die Fehlerquelle nun endlich gefunden.
    Es liegt an der UART-Bridge.

    Ich habe zum testen die RS232 Schnittstelle des Pi's direkt angesteuert und dort hat das Oszilloskop alle Charakter richtig erfasst und angezeigt.
    Demnach macht der CP2102 irgendeinen Fehler, jedoch hab ich keine Ahnung woran das liegen könnte :/

  • Hi,
    ah ok ... naja ... kann schon mal vorkommen.
    Du kannst Rx und Tx vom RPi schon verwenden, jedoch musst Du da auf die max. 3V3 achten, wie Andreas vorher schon anmerkte. Am besten einen Levelshifter verwenden. Notfalls tut's auch ein Spannungsteiler. Betrifft ja nur die Rx Leitung ...

    cu,
    -ds-

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!