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

8 投票
5 回答
21123 浏览
提问于 2025-04-15 18:43

我有一个程序,使用的是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。

socat PTY,link=COM8 PTY,link=COM9

这样就创建了COM8和COM9作为虚拟串口对。

5 个回答

1

我不太懂Python,但我可以给你一些建议:你可以看看这里的C语言代码示例。还有这个手册页面,介绍了/dev/ptmx的相关信息。记得检查一下权限和拥有者是否正确!另外,这里有一个来自linuxquestions的帖子,讲解了如何在C语言中使用它,链接在这里

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),你会发现如果你创建了另一个主从配对,文件描述符(fd)是不同的。所以从主设备读取数据时,你得到的是发给它所连接的从设备的消息。希望这对你或者其他遇到类似问题的人有帮助。

4

根据文档,你需要用到ptsname来获取伪终端的从属端的名字。此外,文档中提到:

在打开伪终端的从属端之前,你必须先将主端的文件描述符传递给grantpt(3)和unlockpt(3)来解锁。

你可以使用ctypes来调用所有需要的函数。

撰写回答