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

时间:2010-02-01 00:46:39

标签: python linux serial-port

我有一个程序,使用pyserial,我想在不使用真正的串口设备的情况下测试它。

在windows中,我使用com0com,在linux中,我知道有一种方法可以创建虚拟串口对,而无需使用额外的程序。

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

我试过(在python中):

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的解决方案(workround)。

socat PTY,link=COM8 PTY,link=COM9

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

5 个答案:

答案 0 :(得分:6)

我正在尝试创建一个使用虚拟串行端口的应用程序,以便使用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)时master的端口名称是相同的,但是如果你创建另一个master,slave对,fd会有所不同,所以从master读取会获得发给他的分配的消息奴隶。我希望这可以帮助您或其他任何遇到类似问题的人。

答案 1 :(得分:3)

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

  

在打开伪终端之前   奴隶,你必须传递主人的文件   grantpt(3)和   unlockpt(3)。

您应该可以使用ctypes来调用所有必需的功能。

答案 2 :(得分:1)

我不知道python,但我可以指出你正确的方向:在C代码示例中查看here。这是/ dev / ptmx的man页面。确保权限和所有者是正确的!这是关于如何从C使用它的linuxquestions forum上的海报。

答案 3 :(得分:0)

您应该考虑使用pty模块,它应该为您解决此问题。 (它打开/ dev / ptmx或调用openpty或打开另一个适当的设备,具体取决于平台。)

答案 4 :(得分:0)

您可以构建一个虚拟对象,该对象实现与您使用的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

如果它像鸭子一样嘎嘎叫它像鸭子一样鸭子......