使用 socat 模拟串行设备

使用 socat 模拟串行设备

我正在尝试使用 socat 模拟外部串行设备。如果我在一个终端中执行此操作:

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

并在另一个中运行我的 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)

它按预期工作:READLINE socat 终端每秒打印一次收到的“查询”,并且我在那里输入的任何内容都会发送到客户端并由客户端打印。

现在我有一个模拟串行设备的 Python 程序:

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

当我从命令行运行它时,它按预期工作:当我输入“查询”时,它会打印一个计数器。

当我尝试用这个命令将双方链接在一起时,却不起作用:

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

在这种情况下,Python 客户端和 socat 窗口均不显示任何数据。
我做错了什么?如何将 'echo.py 的 stdin 和 stdout 链接到 pesudo tty,以便我可以像串行设备一样对其进行读取/写入?

(虽然我在这个例子中使用的是 Python,但是使用 C 编写的模拟器也遇到了同样的问题)

答案1

尝试这个:

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

(由于某种原因,它不喜欢我指定链接=但上面提供了,/dev/pts/6所以我运行了:

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

相关内容