mit serial.write() schreiben, mit cat /dev lesen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
botswanabub
User
Beiträge: 7
Registriert: Dienstag 29. Oktober 2019, 20:45

Hallo zusammen,

ich noch recht am Anfang meiner Python Karriere, habe aber schon einige Zeilen Code erfolgreich umgesetzt und am RPI im Einsatz.

Nun habe ich ein Skript geschrieben, welches mit die CPU-Temp ausliest und diese an einen Pseudo-tty weitergibt. Dies geschieht mit:

Code: Alles auswählen

serialverbindung.write(cpuTemp)
Das funktioniert auch wunderbar und mittel

Code: Alles auswählen

cat /dev/pts/2
kann ich das auch auslesen.
Das Ergebnis demnach:

Code: Alles auswählen

41
42
41
usw ..

Nun meine Frage, vielleicht habe ich auch das ein Verständnisproblem (bin auch kein Linux-Kind):
Kann ich den serial.write so gestalten, dass er quasi den Wert nur aktualisiert, d.h. dem nach dürfte nur ein Wert der sich ändert angezeigt werden. Oder ist das nur die Ausgabe so?
Benutzeravatar
sparrow
User
Beiträge: 4198
Registriert: Freitag 17. April 2009, 10:28

Ich verstehe deine Frage nicht ganz.
Was du irgendwo hin schreibst, bestimmst du ja selbst. Wenn du nur schreiben möchtest, wenn sich der Wert ändert, dann musst du dir den letzten Wert merken und nur, wenn der neue davon abweicht, den auch auf den Port schreiben.
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@botswanabub: `cpuTemp` sollte nach Python-Konventionen so geschrieben werden: `cpu_temp`. Namen klein_mit_unterstrichen. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Abkürzungen sollte man vermeiden, also `cpu_temperature`. Oder `cpu_temperatur`‽ Ich bin mir da nicht sicher weil `serialverbindung` ja eigentlich `serielle_verbindung` oder `serial_connection` heissen sollte. Wonach entscheidest Du wie dieses Denglisch entstehen soll?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
botswanabub
User
Beiträge: 7
Registriert: Dienstag 29. Oktober 2019, 20:45

ok, ich habe mich vermutlich nicht richtig ausgedrückt. ich versuche das noch mal zu beschreiben.
ich benötige ein Stream wie ein 1-Wire Bus ... d.h. es darf nur der aktuellste Wert ausgegeben werden (die Software die das lesen soll kann das nicht anders).
In der Logik dürfte beim auslesen mit cat /dev/... immer nur ein Wert stehen, der sich verändert.

Python-Konventionen sind mir noch nicht alle geläufig, arbeite mich erst rein, aber danke für den Hinweis.
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@botswanabub: Du willst also keinen Stream sondern ein Halbduplexprotokoll bei dem Du nach dem aktuellen Wert fragst und dann eine Antwort bekommst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
botswanabub
User
Beiträge: 7
Registriert: Dienstag 29. Oktober 2019, 20:45

ok, hast einen Anhaltspunkt für mich wie ich das realisiere?
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@botswanabub: Das war im Grunde der Anhaltspunkt. Du darfst halt beim schreiben nicht einfach ständig die gemessene Temperatur schreiben, sondern musst warten das eine Anfrage rein kommt, und dann erst messen und das Ergebnis schreiben. Und beim Leser muss vor dem lesen der aktuellen Temperatur diese erst angefordert werden. Musst halt mindestens ein Byte senden, damit die Messseite der Kommunikation weiss, das sie was tun soll.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
botswanabub
User
Beiträge: 7
Registriert: Dienstag 29. Oktober 2019, 20:45

mh ... ok, da muss ich mich wohl intensiver mit beschäftigen, da weiß ich gerade gar nicht weiter!
Benutzeravatar
sparrow
User
Beiträge: 4198
Registriert: Freitag 17. April 2009, 10:28

@botswanabub Ich glaube es gibt da ein grundsätzliches Verständnisproblem.
Wenn du cat benutzt, dann lässt du dir den Inhalt einer Datei ausgeben. Unter unixoiden Betriebssystemen sind auch serielle Schnittstellen so wie Dateien ansprechbar. Wenn du in diese "Datei" nach und nach Werte schreibst, dann werden die natürlich nach und nach angezeigt.
Du musst also erst einmal klären, wie der Empfänger deiner Daten eben jene Daten erwartet.
botswanabub
User
Beiträge: 7
Registriert: Dienstag 29. Oktober 2019, 20:45

sparrow hat geschrieben: Donnerstag 31. Oktober 2019, 22:00 @botswanabub Ich glaube es gibt da ein grundsätzliches Verständnisproblem.
da hast du vermutlich nicht ganz unrecht. zwar ist mir bekannt und bewusst, dass diese wie Dateien zu handeln sind aber dann hört's auch schon auf.
ich will mal mein vorhaben schildern, vielleicht ist der Ansatz falsch:

Das Programm ließt normalerweise die Daten eines Temp-Sensor über z.B. /sys/bus/w1/devices/SENSOR ein. dieser gibt die Temp als t=xxxxx zurück. nun will ich das Programm statt mit dem Temp-Sensor mit der CPUTemp füttern.
Diese lese ich aus und habe sie bis dato in eine Datei geschrieben welche wiederum von dem Programm ausgelesen wird. das funktioniert auch. ich will aber, da dies auf dem RPI läuft die Schreibvorgänge auf der SD/SSD reduzieren. daher habe ich zunächst eine Micro-Ramdisk erstellt, in der die Temp-Datei abgelegt wird. Funktioniert auch.

Nun war mein Überlegung, das ganze ohne einen künstlichen Dateizugriff zu gestalten. Dazu hatte ich mit Socat eine serielle Schnittstelle geschaffen und die Temp-Daten dahin geschickt. Das geht aber nicht, da das Programm hier eine 1-Wire Schnittstelle erwartet.
Benutzeravatar
sparrow
User
Beiträge: 4198
Registriert: Freitag 17. April 2009, 10:28

Das heißt, es gibt bereits eine Schnittstelle, deren Verhalten nachgebaut werden muss. Was sagt denn

Code: Alles auswählen

cat /sys/bus/w1/devices/SENSOR
?
botswanabub
User
Beiträge: 7
Registriert: Dienstag 29. Oktober 2019, 20:45

nein die gibt es noch nicht. Nach Plan des Programms kann die aber vorhanden sein und würde dann gelesen werden.
Diese würde ausgeben: t=45000 (z.B.)
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@botswanabub: Lösungsansatz: Schreib ein Programm das nur einmal die Temperatur in die Pipe schreibt und verwende `socat` so das dieses Programm nicht ständig läuft, sondern immer nur dann ausgeführt wird wenn das andere Ende der Pipe geöffnet und gelesen werden soll.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
botswanabub
User
Beiträge: 7
Registriert: Dienstag 29. Oktober 2019, 20:45

ok, danke erstmal dafür. da muss ich wie gesagt intensiver mit beschäftigen, das kann ich nur in der theorie nachvollziehen.
Antworten