【问题标题】:How to determine which pair of pseudo tty ports are connected to each other如何确定哪对伪tty端口相互连接
【发布时间】:2018-04-15 23:06:35
【问题描述】:

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

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

控制台返回以下内容,表示现在连接在一起的两个 pty 端口:

2018/04/15 22:33:03 socat[18197] N PTY is /dev/pts/2
2018/04/15 22:33:03 socat[18197] N PTY is /dev/pts/3
2018/04/15 22:33:03 socat[18197] N starting data transfer loop with FDs [5,5] and [7,7]

那我得手动修改这两个程序,为每个程序指定串口,如:

在程序 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 命令阻塞,我无法捕获其标准错误输出以将其放入变量中。如果可以的话,我就可以解析这个变量,然后继续我的快乐之路。

有什么想法吗?或者也许有更好的方法来做到这一点?

谢谢!

【问题讨论】:

    标签: python serial-port pty socat


    【解决方案1】:

    您可以使用 python 中的低级别 Popen 类运行 socat 而不会阻塞。您需要重定向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()
    

    【讨论】:

    • 你摇滚!太棒了,正是我需要的。我投了赞成票,但我的 SO 点数很低,所以公开页面上不会显示向上性。
    • 我注意到您的编辑更改为for line in iter(socat_proc.stderr.readline,''): - 我的解决方案不起作用吗?我知道有些人将这种形式用于管道,但我通常没有看到任何需要。
    猜你喜欢
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2023-03-21
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    相关资源
    最近更新 更多