我有一个程序,使用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创建为虚拟串行端口对。
答案 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
如果它像鸭子一样嘎嘎叫它像鸭子一样鸭子......