mikrocontroller.net

Forum: PC-Programmierung Linux dev loopback


Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte mit einer bestehende Software unter Linux, welche 
üblicherweise über eine einzutragende serielle Schnittstelle 
kommuniziert (etwa /dev/ttyS0), direkt auf der selben Maschine sprechen. 
Das andere Ende ist eine selbst zu schreibende Software in Python oder 
C. Gibt es eine Art Loopback-device, welches ich in beiden Programmen 
angeben kann so das die Daten von Programm A zu B gehen und umgekehrt?

Schöne Grüße
Werner

Autor: Gerd E. (robberknight)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pseudo tty.

Oder Du verwendest socat.

Autor: nada (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nada schrieb:
> https://en.wikipedia.org/wiki/Named_pipe

Da dürften aber die Versuche des Programms, die Schnittstellenparameter 
(Baudrate und so) einzustellen, fehlschlagen. Man kann natürlich mal 
ausprobieren, ob es trotzdem weitermacht. Außerdem ist eine Named Pipe, 
soweit ich weiß, nicht bidirektional. Da müsste man eher einen unix 
domain socket nehmen.

Autor: nada (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf M. schrieb:
> Außerdem ist eine Named Pipe,
> soweit ich weiß, nicht bidirektional.

Wahrscheinlich richtig. Unter Linux können zwar beliebig viele Prozesse 
in den FIFO mit O_RDWR nutzen, aber vermutlich ist es dann reine 
Glückssache, ob man sein eigenes echo ausliest oder Nachrichten vom 
anderen Prozess.
Schnittstellenparamter aber sollte man besser extern mit stty tweaken, 
wenn es sein muss, denke ich. Das verkompliziert doch sonst nur unnötig 
ein Programm, das dazu eigentlich gar nicht gedacht ist.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nada schrieb:
> Schnittstellenparamter aber sollte man besser extern mit stty tweaken,
> wenn es sein muss, denke ich. Das verkompliziert doch sonst nur unnötig
> ein Programm, das dazu eigentlich gar nicht gedacht ist.

Soweit ich verstanden habe, geht es hier aber genau um das umgekehrte: 
Ein Programm, das eigentlich für die serielle Schnittstelle gedacht ist, 
ohne eine solche zu betreiben.
Und da ist es nicht so unwahrscheinlich, dass das Programm versucht, die 
Schnittstellenparameter einzustellen und dann mit Fehlermeldung 
abbricht, wenn das nicht geht.

: Bearbeitet durch User
Autor: Noch einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob das stty der bestehenden Software mit einem pseudo tty funktioniert, 
kannst du recht einfach ausprobieren. Die normalen X11 Terminals legen 
eines an.
$ tty
/dev/pts/0
$ stty -F /dev/pts/0
speed 38400 baud; line = 0;
eol = M-^?; eol2 = M-^?; swtch = M-^?;
ixany iutf8
$ stty -F /dev/pts/0 9600
$ stty -F /dev/pts/0
speed 9600 baud; line = 0;
eol = M-^?; eol2 = M-^?; swtch = M-^?;
ixany iutf8

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ein Programm, das eigentlich für die serielle Schnittstelle gedacht ist,
>ohne eine solche zu betreiben.

Ja Rolf, so ist es.

Ich habe mit die pseudo TTYs inzwischen angesehen, allerdings werde ich 
da nicht so recht schlau draus; in Python gibts es pty.openpty(), dann 
erhalte ich die die beiden Handles eines neuen Pseudo-TTYs, aber was 
soll mir das nun bringen?

Konkret geht es um einen Geräteemuator für FHEM. Die (Pseudo-) 
Schnittstelle muss es schon geben, wenn FHEM startet (Autostart), und 
der Name muss bekannt sein. Andersum: Gibt es die Möglichkeit ein Gerät 
mit dem Namen "/dev/meinemulator" zu definieren, und so Daten hin- und 
herzuschicken?

Werner

Autor: Daniel Abrecht (daniel-a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Womit willst du es denn kommunizieren lassen? Ein anderes Programm? Ein 
eigenes Program? Oder eine Console?

Die modernen pseudoterminals funktionieren grob gesagt, indem /dev/ptmx 
geöffnet wird, das ist dan das master device (ptm), und der Kernel 
erstellt dann automatisch ein slave device (pts) in /dev/pts/<nummer>. 
Befor man das das pts verwenden kann muss muss man dieses über das ptm 
mit einem ioctl freischalten. Es gibt einen weiteren ioctl um den Pfad 
des pts zu ermitteln. Diese ioctls haben in c funktionen welche diese 
astrahieren, nämlich grantpt, unlockpt, und ptsname.

Wenn du ein Programm hast, welches ein pts erstellt, und du willst 
diesem einen festen Namen geben, könntest du wenn du dieses erstellst 
zusätzlich noch einen symlink darauf erstellen.

Man könnte alternativ auch ein programm erstellen, welches das pts 
erstellt, öffnet, mit dup2() auf einen fixen filedescriptor legt, und 
dann das FHEM programm öffnet. Im FHEM programm könnte man dann 
/dev/fd/<nummer> oder /proc/self/fd/<nummer> als tty eintragen, wobei 
die nummer die ist, die man für den file descriptor gewählt hat.

Es gibt viele Programme, die ein pts erzeugen. Dazu gehören 
Terminalemulatoren, screen, ssh, etc. Deren pts kann man wie jedes tty 
mit dem tty kommando ermitteln. Das tty kommando schaut dafür nur den 
filedescriptor 0, stdin an.

: Bearbeitet durch User
Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte mit einem eigenen Programm kommunizieren. So wie das klingt 
müsste ich mir ein (C-) Programm schreiben, welche vor FHEM im Autostart 
als Daemon gestartet wird, und dann zwei Geräte mit bestimmten Namen 
nach obigem Vorgehen erzeugt. Dann hätte ich /dev/meinshin und 
/dev/meinsher und würde im FHEM /dev/meinshin angeben, und in meinem 
Programm /dev/meinsher.

Autor: Noch einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest es auch aus einem alten Programm wie dem rlogind kopieren.

Diese Generation war noch kompakt und übersichtlich aufgebaut. Rlogind 
hatte der Shell und allen Programmen vorgegaukelt, sie würden an einem 
realen vt100 Terminal an einer seriellen Schnittstelle hängen.

Autor: Martin S. (strubi)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Socat wurde doch schon genannt. Das ist die einfachste Methode. Siehe 
angehängtes Script..

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.