RS232 Datenübertragung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Hallo liebe Programmierer :mrgreen:

ich bin noch recht neu in der Python Welt und erstelle derzeit in einem Projekt eine Oberfläche/GUI auf dem Raspberry, womit ich Daten eines Messgerätes aufzeichnen und speichern kann. Dieses funktioniert soweit auch sehr gut. Jedoch verwende ich hierzu das analoge Ausgangssignal (Spannung) des Messgerätes. Nun möchte ich das ganze noch Digital versuchen.
Hierbei habe ich nur leider seit Tagen keinen Fortschritt. Ich verwende dazu den Raspberry und einen CP2102 Konverter.

Als Hintergrundinfo: Das Messgerät besitzt einen Knopf, mit dem manuell ein Wert gesendet werden kann. Dieser kommt auch an, wenn mein Programm Starte, und eben diese Taste betätige. So erscheint in der Ausgabe der korrekte Displaywert. Ich bin mir auch über die Anschlüsse noch nicht ganz sicher, wie es richtig verbunden wird. Ich habe nur TX RX und GND am Messgerät die ich benutzen kann (ansonsten noch Analog und Mitutoyo). Wenn ich TX auf TX und RX auf RX schalte, bekomme ich den Wert korrekt per Knopfdruck. Wenn ich TX auf RX und RX auf TX schalte, wird nur noch ein Code in Hex ausgegeben. Und sobald ich GND dazuschalte, funktioniert gar nichts mehr. Wenn ich die Zeile ser.timeout = 0.1 verwende, kommt immer nur die Antwort: b' '. Als ob nicht ausgelesen werden kann. Meiner Vermutung nach ist einfach der Befehl oder Inhalt falsch, welche ich dem Messgerät sende.

Hier mein einfacher Code:

Code: Alles auswählen

import serial, time

port = 'usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0'

ser = serial.Serial('/dev/serial/by-id/' + port)
ser.timeout = 0.1
ser.baudrate = 9600
ser.bytesize = 8
ser.parity = 'N'
ser.startbits = 1
ser.stopbits = 1
#ser.close()
#ser.open()


ser.write(b'a?\r\n')
antwort = ser.readline()
print(antwort)

In der Anleitung steht hierzu folgender Absatz:

"Die im Display angezeigten Werte können auch einzeln über die RS-232 Schnittstelle von einem Rechner angefordert werden, indem man a"?" (ASCII D63 [3fh] eingibt)."

Ich habe nun in dem Programm schon jede erdenkliche Kombiantion eingeben, da die Anleitung meiner Meinung nach sehr Schwammig geschrieben ist, und auch die Klammersetzung komisch ist. Vielleicht handelt es sich hier sogar um einen Übersetzungsfehler :(

Habt ihr vielleicht eine Idee, woran es liegen kann, dass ich keine Antwort bekomme?



Vielen Dank für euer Bemühungen im vorraus

LG PythonDonald :geek:
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ohne das die elektrische Situation geklärt ist, kann man keine Aussage treffen. Ohne ground geht nicht, und traditionell müssen RX auf TX und umgekehrt verbunden werden. Und das die Spannungen kompatibel sind muss auch sichergestellt sein. Sonst frittierst du eine oder beide Seiten.

Was das Zeichen angeht - IMHO ein einzelnes Fragezeichen. Ganz bestimmt ohne a davor. Das ist eine komische Notation die “ascii” bedeuten soll denke ich mal. Ob nach dem Fragezeichen dann noch CRLF wie bei dir kommen müssen - kann sein. Halte ich aber für unwahrscheinlich, wenn es sich hierbei um das einzige Kommando handelt. Oder kann das Ding mehr?
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Danke für deine Antwort deets.

Ich schaue mir mal beide Spannungen an.

Was genau meinst du mir kann das Ding mehr?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und nochmal ein nachtrag: um die Verkabelung zu prüfen, muss dein Programm einfach nur die ganze Zeit lesen. Oder du benutzt zb screen dafür, “screen /dev/usb-Serial... 9600” - und dann müssen da Daten ankommen.

Mit “mehr” meine ich kann das mehr Einstellungen/Befehle seriell entgegen nehmen. Davon hängt ab, ob man ein komplexeres Protokoll als ein-Zeichen-Nachrichten braucht. Sieht aber nicht so aus, ich habe http://www.bronx-systems.de/download.ph ... a61661d17a gefunden. Also OHNE CRLF probieren!
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Danke.

Ne also laut Anleitung kann nur dieser eine Befehl eingeben werden. Und ich habe genau dieses Gerät ;) Soll ich dieses screen einfach oben in den Pfad reinschreiben?
Und ohne CRLF geht es leider auch nicht :(


screen/dev... funktioniert leider nicht (file not found error)
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst schon ein bisschen abstrahieren. Damit war der Pfad zu deinem USB serial device gemeint. Den ich hier auf meinem iPhone nicht komplett runterbeten kann und will.

Und screen ist ein externes Programm. Damit kannst du OHNE Python verifizieren, ob bei Druck auf die TXD Taste Daten ankommen.

Last but not least: doch, das Ding kann mehr. Die Anleitung ist schlecht, aber es werden Control Codes erwähnt die auch die anderen Tasten emulieren. Waschsalon genau heißt muss ich mal recherchieren.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und noch eine Anmerkung: durch deinen absurd kleinen timeout kehrt der Versuch zu lesen zu schnell zurück. Potentiell bevor eine Antwort kommt. Warum hast du den eingeführt?
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Hi,

also ich habe das im Pfad so wie du gesagt hast eingefügt, aber da kommt halt: File Not Found Error.

Kurz zu dem Screen. Ich habe auf dem Raspberry das Programm CuteCom installiert. Damit habe ich überprüft, das auf Tastendruck der richtige Wert wie in meinem Programm ankommt und danach habe ich den TX vom Raspi auf den RX vom Raspi geschaltet und gesehen, dass wenn ich ein Wort sende, es auch wieder ankommt. Meinst du so etwas in der Art?

Den Timeout habe ich leider durch Unkenntnis übernommen. Heißt es das nach 0,1 Sekunden abgebrochen wird und vielleicht danach erst die Antwort kommt?
Soll ich das rausnehmen?



Ich war fleißig und habe mit dem Oszilloskop die Signale aufgenommen. Das Messgerät ist im Ruhezustand auf ca. 5,7 Volt und beim Senden von Daten im Bereich von + / - 5,7 Volt. Der Raspi ist im Ruhezustand auf 3,3 Volt und beim Senden im Bereich von 0 Volt - 3,3 Volt. Daher denke ich passt es nicht zusammen oder ? Ich als Leihe würde jetzt sagen das es per Knopfdruck geht, weil 5,7 erkennt der Pi als HIGH und -5,7 als 0 Volt und somit LOW richtig ? Andersrum sind die 0 Volt vom Raspi natürlich keine -5,7 Volt, die das Messgerät erwartet. Würdest du das so unterschreiben?


LG und Danke, du hilft mir echt weiter :)
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was ich meinte ist der Pfad

/dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0

Den moechte ich nicht auf dem iPhone eingeben (jetzt sitze ich am Rechner...), aber das ist nunmal der Pfad zu deiner seriellen Schnittstelle.

Aber wenn du mit einem anderen Terminal-Programm verifiziert hast, dass es geht, ist das ja prinzipiell ok, und du musst es nicht mit screen machen.

Der PI wiederum hat NICHTs mit der seriellen Schnittstelle und deren Volt zu tun. Das haette er nur, wenn du den ihm eingebauten UART auf der Pinleiste verwandt haettest - aber dann waere er auch schon kaputt. +/-5V sind "normal" 5V TTL seriell, und durch Glueck hast du wohl einen Adapter, der das schluckt.

Hast du mal die Dokumentation des serial Moduls angeschaut? Was steht da zu dem Thema timeout?
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Guten Morgen, ja den Pfad habe ich in sofern geändert, wie du es gesagt hattest, aber leider ohne Erfolg.

Okay, dann brauche ich das mit dem Programm Screen ja nicht mehr überprüfen.


Ich habe hier in der Doku geschaut, aber nichts gefunden:
https://www.silabs.com/documents/public ... 2102-9.pdf

Hast du noch eine Möglichkeit, wieso das nicht funktioniert? Passt das denn jetzt mit den Pegeln?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe nicht nach der silabs Dokumentation gefragt. Sondern der von pyserial. Und was es mit timeout auf sich hat.

Und warum kehrst du immer wieder zu den Pegeln etc zurück, wenn du etabliert hast, das es geht? Python braucht keine anderen Pegel als ein serielles Terminal Programm.
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Achso sorry. Ich werde da noch mal nachschauen.

Naja ich habe ja nur festgestellt, dass die Pegel unterschiedlich sind. Aber du meinst, dass ist ja der normale Pegel, dann ist ja gut. Tut mir leid.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt eine andere Anleitung zu einem umfangreicheren Gerät das augenscheinlich eine ähnliche wenn nicht gleiche Firmware benutzt. Daraus geht auch nochmal klarer das ? hervor.

https://static.brw.ch/pdf/6023_MAN_172120_AFG_Mk4_D.pdf

Und die ASCII-Werte 0x01-0x05 zur Emulation von Tasten. So wie viele andere Möglichkeiten, die ggf auch. Ei dir gehen.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

regulär ist der pfad /dev/ttyUSB0 oder 1,2,3 für ein silabs chipsatz
empty Sig
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

@deets:
ich kann ja andere Befehle noch mal testen, aber bei mir geht das mit dem ? ja leider immer noch nicht. :(


@haaryberlin:
danke, das habe ich am Anfang auch versucht, aber ist meine Bezeichnung nicht genauer? das habe ich quasi ausgelesen? meinst du daran kann das liegen? woher weiß ich denn welcher USB-Port das ist?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, am Pfad kann das nicht liegen. Das ist ein begrüßenswertes Feature das da ein präziser Name vergeben wird, statt einer nicht stabilen Aufzählung.

Ich frag zum dritten mal: hast du dir angeschaut was der timeout bewirkt?
Antworten