Linux的虚拟串行端口

时间:2008-09-09 15:36:20

标签: linux serial-port virtual-serial-port

我需要在Linux上测试串口应用程序,但是,我的测试机只有一个串口。

有没有办法向Linux添加虚拟串口并通过shell或脚本模拟设备来测试我的应用程序?

注意:我无法重新映射端口,它在ttys2上硬编码,我需要在编写时测试应用程序。

8 个答案:

答案 0 :(得分:130)

补充@ slonik的答案。

您可以测试socat以创建虚拟串行端口,执行以下过程(在Ubuntu 12.04上测试):

打开一个终端(让我们称之为终端0)并执行它:

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

上面的代码返回:

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/2
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/3
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs [3,3] and [5,5]

打开另一个终端并写入(终端1):

cat < /dev/pts/2

此命令的端口名称可以根据pc更改。这取决于之前的输出。

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**2**
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**3**
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs 

你应该使用突出显示区域的可用数字。

打开另一个终端并写入(终端2):

echo "Test" > /dev/pts/3

现在回到1号航站楼,你会看到字符串“Test”。

答案 1 :(得分:69)

您可以使用pty(“伪电传”,其中串行端口是“真正的电传打字机”)。从一端打开/dev/ptyp5,然后将您的程序附加到/dev/ttyp5; ttyp5将像串口一样运行,但会通过/ dev / ptyp5发送/接收它所做的一切。

如果你确实需要它与名为/dev/ttys2的文件交谈,那么只需移开旧的/dev/ttys2并制作符号链接ptyp5ttys2

当然,你可以使用ptyp5以外的其他数字。也许选择一个高数字以避免重复,因为你的所有登录终端也将使用ptys。

维基百科有关于ptys的更多信息:http://en.wikipedia.org/wiki/Pseudo_terminal

答案 2 :(得分:38)

使用socat:

例如:

socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11

答案 3 :(得分:16)

还有tty0tty http://sourceforge.net/projects/tty0tty/这是一个真正的用于Linux的零调制解调器模拟器。

这是一个简单的内核模块 - 一个小型源文件。我不知道为什么它只是对sourceforge大肆宣传,但它对我来说效果很好。最好的是它还模拟硬件引脚(RTC / CTS DSR / DTR)。它甚至实现了TIOCMGET / TIOCMSET和TIOCMIWAIT iotcl命令!

在最近的内核上,您可能会遇到编译错误。这很容易解决。只需在模块/ tty0tty.c源代码的顶部插入几行(在包含之后):

#ifndef init_MUTEX
#define init_MUTEX(x) sema_init((x),1)
#endif

加载模块时,会创建4对串口。设备是/ dev / tnt0到/ dev / tnt7,其中tnt0连接到tnt1,tnt2连接到tnt3等。 您可能需要修复文件权限才能使用这些设备。

编辑:

我想我的热情有点快。虽然司机看起来很有希望,但似乎不稳定。我不确定,但我认为它在我在家工作的办公室里撞坏了一台机器。我不能检查,直到我星期一回到办公室。

第二件事是TIOCMIWAIT不起作用。代码似乎是从一些“微小的tty”示例代码中复制而来的。 TIOCMIWAIT的处理似乎已经到位,但它永远不会被唤醒,因为缺少对wake_up_interruptible()的相应调用。

编辑:

办公室的崩溃确实是司机的错。缺少初始化,完全未经测试的TIOCMIWAIT代码导致机器崩溃。

我昨天和今天都在重写驱动程序。有很多问题,但现在它适用于我。由驱动程序管理的硬件流控制仍然缺少代码,但我不需要它,因为我将使用TIOCMGET / TIOCMSET / TIOCMIWAIT从用户模式代码自行管理引脚。

如果有人对我的代码版本感兴趣,请给我发一条消息,我会发给您。

答案 4 :(得分:8)

您可能希望使用内核驱动程序查看Tibbo VSPDL创建Linux虚拟串行端口 - 它看起来很新,现在可以下载(测试版)。目前还不确定许可证,或者他们是否希望将来只在商业上提供许可证。

还有其他商业选择,例如http://www.ttyredirector.com/

在开源中,Remserial(GPL)也可以使用Unix PTY来做你想要的。它以“原始形式”将串行数据传输到网络套接字;必须在创建端口时完成类似STTY的终端参数设置,稍后如RFC 2217中所述更改它们似乎不受支持。您应该能够运行两个remserial实例来创建像com0com这样的虚拟nullmodem,除了您需要提前设置端口速度等。

Socat(也是GPL)就像是Remserial的扩展变体,有很多选项,包括用于将PTY重定向到其他东西的“PTY”方法,可以是Socat的另一个实例。对于Unit tets,socat可能比remserial更好,因为你可以直接将文件存入PTY。请参阅联机帮助页上的PTY example。 “contrib”下的patch exists为协商串行线路设置提供RFC2217支持。

答案 5 :(得分:6)

使用前面答案中发布的链接,我使用虚拟串行端口在C ++中编写了一个小例子。我将代码推送到GitHub:https://github.com/cymait/virtual-serial-port-example

代码非常自我解释。首先,通过运行./main master创建主进程,它将打印到设备正在使用的stderr。之后,您调用./main从属设备,其中device是在第一个命令中打印的设备。

就是这样。您在两个进程之间有双向链接。

使用此示例,您可以通过发送所有类型的数据来测试应用程序,并查看它是否正常工作。

此外,您始终可以对设备进行符号链接,因此您无需重新编译正在测试的应用程序。

答案 6 :(得分:4)

您是否可以使用USB-&gt; RS232适配器?我有一些,他们只使用FTDI驱动程序。然后,您应该能够将/ dev / ttyUSB0(或任何创建的内容)重命名为/ dev / ttyS2。

答案 7 :(得分:3)

我可以想到三个选择:

实施RFC 2217

RFC 2217涵盖TCP / IP标准的com端口,允许一个系统上的客户端模拟到本地程序的串行端口,同时透明地向另一个系统上的服务器发送和接收数据和控制信号。实际上有串口。这是一个high-level overview

您要做的是找到或实现一个客户端COM端口驱动程序,它将在您的PC上实现系统的客户端 - 看起来是一个真正的串行端口,但实际上是将所有内容传递给服务器。您可以从Digi,Lantronix等免费获得此驱动程序,以支持其真正的独立串行端口服务器。

然后,您将在另一个程序中本地实现连接的服务器端 - 允许客户端根据需要连接并发出数据和控制命令。

这可能是非常重要的,但RFC就在那里,您可能能够找到实现连接的一面或两面的开源项目。

修改linux串口驱动程序

或者,Linux的串行端口驱动程序源随时可用。拿出来,把硬件控件放到一边,让一个驱动程序运行两个/ dev / ttySx端口,作为一个简单的环回。然后将您的真实程序连接到ttyS2,将模拟器连接到其他ttySx。

在环回中使用两根USB&lt; - &gt;串行电缆

但现在最容易做的事情是什么?在两个串行端口USB设备上花费40美元,将它们连接在一起(零调制解调器),实际上有两个真正的串行端口 - 一个用于您正在测试的程序,一个用于您的模拟器。

- 亚当