如何确定哪对伪tty端口连接到每个oth

2024-06-16 18:51:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个python程序,它们通过点对点的tty串行连接相互通信。为了模拟连接,我使用socat创建一个双向字节流,如下所示:

socat -d -d pty,raw,echo=0 pty,raw,echo=0

控制台返回以下信息,指示现在连接在一起的两个pty端口:

^{pr2}$

然后我必须手动修改这两个程序中的每一个,以指定每个程序的串行连接,例如:

在程序A.py中:

import serial
...
ser = serial.Serial('/dev/pts/2')

在程序B.py中:

import serial
...
ser = serial.Serial('/dev/pts/3')

我想要的是一个脚本,它将设置socat连接,然后执行a.py,其中一个端口号作为参数传递给它,并使用另一个端口号作为参数传递给它执行B.py。在

我尝试过bash脚本,但是socat命令阻塞了,我无法捕获其stderr输出以将其放入变量中。如果可以的话,我就可以解析变量,然后就可以快乐地生活了。在

有什么想法吗?或者是个更好的方法?在

谢谢你!在


Tags: pydevimportecho程序脚本rawserial
1条回答
网友
1楼 · 发布于 2024-06-16 18:51:30

您可以在不阻塞的情况下运行socat,使用python中的低级Popen类。您需要重定向stderr,以便扫描pty名称,但在获得所需信息后,可以将其交给后台线程。在

import sys
import subprocess as subp
import threading
import shutil
import re

socat_proc = subp.Popen(['socat', '-d', '-d', 'pty,raw,echo=0', 'pty,raw,echo=0'],
    stderr=subp.PIPE)

try:
    # scan output for 2 ptys
    ptylist = []
    for line in socat_proc.stderr:
        line = line.decode().strip()
        print(line)
        pty = re.search(r"N PTY is (.+)", line)
        if pty:
            ptylist.append(pty.group(1))
            if len(ptylist) == 2:
                break

    if socat_proc.poll() is not None:
        print("badness. socat dead.")
        exit(2)

    # background thread consumes proc pipe and sends to stdout
    socat_thread = threading.Thread(target=shutil.copyfileobj, 
        args=(socat_proc.stdout, sys.stdout))
    socat_thread.daemon = True
    socat_thread.start()

    print("pty", ptylist)

    # now you can start your programs...

finally:
    socat_proc.terminate()

相关问题 更多 >