web-dev-qa-db-ja.com

socatでシリアルデバイスになりすます

Socatを使用して外部シリアルデバイスになりすますことを試みています。 1つの端末でこれを行う場合:

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

そして、この簡略化されたバージョンのmy Pythonシリアルインターフェイスクライアントを別のクライアントで実行します:

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

期待どおりに機能します。READLINEsocat端末は受信した「クエリ」を毎秒出力し、そこで入力したものはすべてクライアントに送信されて出力されます。

これで、シリアルデバイスをエミュレートするPythonプログラムができました:

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

これは、コマンドラインから実行すると意図したとおりに機能します。「query」と入力すると、カウンターが出力されます。

うまくいかないのは、このコマンドで2つの側面をリンクしようとしたときです。

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

この場合、Pythonクライアントもsocatウィンドウもデータを表示しません。
何が間違っているのですか? 'echo.pyのstdinとstdoutをpesudottyにリンクして、シリアルデバイスのように読み取り/書き込みできるようにするにはどうすればよいですか?

(この例ではPythonを使用していますが、Cで記述されたエミュレーターでも同じ問題が発生します)

3
AShelly

これを試して:

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

(何らかの理由で、link =を指定するのは気に入らなかったが、上記で提供された/dev/pts/6だから私は走った:

$ Sudo python pyserial1.py
4
1
1
8
...
2
glallen