Identifizieren Sie ein serielles Gerät mit socat

4788
AShelly

Ich versuche, Socat zu verwenden, um sich als externes serielles Gerät auszugeben. Wenn ich das in einem Terminal mache:

sudo socat -ddd -ddd PTY,raw,link=/dev/ttyS32,echo=0 READLINE 

und führen Sie diese vereinfachte Version meines seriellen Python-Interface-Clients in einem anderen aus:

import serial s = serial.Serial('/dev/ttyS32',baudrate=9600,timeout=1) while True: s.write("query\n") resp = s.read() if resp: print(resp) 

Es funktioniert wie erwartet: Das READLINE socat-Terminal druckt jede Sekunde eine empfangene "Abfrage", und alles, was ich dort eingebe, wird an den Client gesendet und von diesem gedruckt.

Jetzt habe ich ein Python-Programm, das das serielle Gerät emuliert:

#echo.py n=0 while True: s = raw_input() if 'query' in s: print n n+=1 

Dies funktioniert wie beabsichtigt, wenn ich es über die Befehlszeile ausführe: Wenn ich 'Abfrage' eingebe, wird ein Zähler ausgegeben.

Was nicht funktioniert ist, wenn ich versuche, die beiden Seiten mit diesem Befehl zu verknüpfen:

sudo socat -ddd -ddd PTY,raw,link=/dev/ttyS32,echo=0 EXEC:"python echo.py" 

In diesem Fall zeigen weder der Python-Client noch das Socat-Fenster Daten.
Was mache ich falsch? Wie verbinde ich 'echo.pys stdin und stdout mit dem Pesudo tty, damit ich es wie ein serielles Gerät lesen / schreiben kann?

(Obwohl ich in diesem Beispiel Python verwende, habe ich dasselbe Problem mit einem Emulator, der in C geschrieben wurde.)

3

1 Antwort auf die Frage

2
glallen

Versuche dies:

sudo socat -ddd -ddd PTY,raw,echo=0 "EXEC:'python /tmp/echo.py',pty,raw,echo=0" 

(aus irgendeinem Grund mochte mich nicht den Link Angabe = aber die oben angegebenen /dev/pts/6so lief ich:

$ sudo python pyserial1.py 4 1 1 8 ...