我正在尝试使用 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
...