代码之家  ›  专栏  ›  技术社区  ›  linjunhalida

如何使用/dev/ptmx创建虚拟串行端口?

  •  6
  • linjunhalida  · 技术社区  · 14 年前

    我有一个使用pyserial的程序,我想不用真正的串行端口设备来测试它。

    在Windows中,我使用COM0COM,在Linux中,我知道有一种方法可以在不使用附加程序的情况下创建虚拟串行端口对。

    所以我查阅了手册,找到了pts,/dev/ptmx,但是我不知道如何按照手册创建一对,有人能给我举个例子吗?

    我试过(在巨蟒中):

    f = open("/dev/ptmx", "r")
    

    它可以工作,/dev/pts/4被创建。

    我试过:

    f = open("/dev/4", "w")
    

    结果是:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IOError: [Errno 5] Input/output error: '/dev/pts/4'
    

    编辑: 我使用SOCAT找到了一个解决方案(解决方案)。

    socat PTY,link=COM8 PTY,link=COM9
    

    然后将COM8 COM9创建为虚拟串行端口对。

    5 回复  |  直到 6 年前
        1
  •  3
  •   Alex Martelli    14 年前

    the docs 你需要 ptsname 获取伪终端从端的名称,并引用文档,

    打开伪终端前 从,你必须通过主文件 grantpt(3)和的描述符 解锁(3)。

    你应该能用 ctypes 调用所有需要的函数。

        2
  •  6
  •   Aquiles    11 年前

    我试图让一个应用程序使用虚拟串行端口,以便使用TCP/串行转换与一些远程设备通信…我遇到了一个和你类似的问题。我的解决方案如下:

    import os, pty, serial
    
    master, slave = pty.openpty()
    s_name = os.ttyname(slave)
    
    ser = serial.Serial(s_name)
    
    # To Write to the device
    ser.write('Your text')
    
    # To read from the device
    os.read(master,1000)
    

    虽然如果您检查(/dev/ptmx),主机端口的名称是相同的,但是如果您创建另一个主机-从机对,则fd是不同的,因此从主机读取信息会得到发送给其分配的从机的消息。我希望这能帮助你或其他遇到类似问题的人。

        3
  •  1
  •   t0mm13b    6 年前

    我不认识巨蟒,但我可以给你指出正确的方向:看 here 在C代码示例中。这里是 man /dev/ptmx的页面。确保权限和所有者正确!这是LinuxQuestions的海报 forum 关于如何使用它。

        4
  •  0
  •   Thomas Wouters    14 年前

    你应该考虑使用 pty 相反,模块应该为您处理这个问题。(它打开/dev/ptmx或调用 openpty 或者打开另一个合适的设备,具体取决于平台。)

        5
  •  0
  •   badp    14 年前

    您可以构建一个实现与 pySerial 你使用的类,但是要做一些完全不同的、容易复制的事情,比如读文件和写文件/终端等。

    例如:

    class DummySerial():
      #you should consider subclassing this
      def __init__(self, *args, **kwargs):
        self.fIn = open("input.raw", 'r')
        self.fOut = open("output.raw", 'w')
        pass
      def read(self, bytes = 1):
        return self.fIn.read(bytes)
      def write(self, data):
        self.fOut.write(data)
      def close(self):
        self.fIn.close()
        self.fOut.close()
      #implement more methods here
    

    如果它像鸭子一样咯咯叫,像鸭子一样鸭子…