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
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.
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.
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
Ob das stty der bestehenden Software mit einem pseudo tty funktioniert, kannst du recht einfach ausprobieren. Die normalen X11 Terminals legen eines an.
1 | $ tty |
2 | /dev/pts/0 |
3 | $ stty -F /dev/pts/0 |
4 | speed 38400 baud; line = 0; |
5 | eol = M-^?; eol2 = M-^?; swtch = M-^?; |
6 | ixany iutf8 |
7 | $ stty -F /dev/pts/0 9600 |
8 | $ stty -F /dev/pts/0 |
9 | speed 9600 baud; line = 0; |
10 | eol = M-^?; eol2 = M-^?; swtch = M-^?; |
11 | ixany iutf8 |
>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
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
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.
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.
Socat wurde doch schon genannt. Das ist die einfachste Methode. Siehe angehängtes Script..
Martin, Danke, das sieht schon mal sehr vielverpsrechend aus. Allerdings kann ich den FHEM (das Ende welches eigentlich die echte serielle Schnittstelle erwartet) nicht zum Dialog überreden. Womöglich hat das mit den Rechten zu tun. Der FHEM Daemon läuft unter dem Benutzer "fhem". Am anderen Ende (ssh als Benutzr "pi") muss ich ein sudo vor das Minicom stellen, damit ich /tmp/virtualcom geöffnet bekomme. Kann jemand helfen? Werner
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.