Linux的虚拟串行端口
我需要在Linux上testing一个串口应用程序,但是我的testing机只有一个串口。
有没有办法将虚拟串行端口添加到Linux并通过shell或脚本模拟设备来testing我的应用程序?
注意:我无法重新映射端口,它在ttys2上硬编码,我需要testing应用程序。
你可以使用一个pty(“伪电传”,其中一个串口是一个“真正的电传”)。 从一端,打开/dev/ptyp5
,然后将你的程序附加到/dev/ttyp5
; ttyp5
将像串口那样工作,但是会通过/ dev / ptyp5发送/接收所有的东西。
如果你确实需要和一个名为/dev/ttys2
的文件进行/dev/ttys2
,那么只需将你的旧的/dev/ttys2
,并从ptyp5
创build一个符号链接到ptyp5
即可。
当然你可以使用ptyp5
以外的其他ptyp5
。 也许select一个高数字,以避免重复,因为所有的loginterminal也将使用ptys。
维基百科有关于ptys的更多信息: http : //en.wikipedia.org/wiki/Pseudo_terminal
补充@ slonik的答案。
您可以testingsocat创build虚拟串行端口执行以下过程(在Ubuntu 12.04上testing):
打开一个terminal(我们称之为terminal0)并执行它:
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]
打开另一个terminal并写入(terminal1):
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
您应该使用突出显示的区域上可用的号码。
打开另一个terminal并写(terminal2):
echo "Test" > /dev/pts/3
现在回到terminal1,你会看到string“testing”。
为此使用socat:
例如:
socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11
还有tty0tty http://sourceforge.net/projects/tty0tty/这是一个真正的null调制解调器模拟器的Linux。;
它是一个简单的内核模块 – 一个小的源文件。 我不知道为什么它只是在sourceforge上下了大拇指,但对我来说效果不错。 最好的事情就是模拟硬件引脚(RTC / CTS DSR / DTR)。 它甚至实现TIOCMGET / TIOCMSET和TIOCMIWAIT iotcl命令!
在最近的内核上,你可能会遇到编译错误。 这很容易解决。 只需在模块/ tty0tty.c源代码的顶部插入几行(在包含之后):
#ifndef init_MUTEX #define init_MUTEX(x) sema_init((x),1) #endif
当模块被加载时,它会创build4对串行端口。 这些设备是/ dev / tnt0到/ dev / tnt7,其中tnt0连接到tnt1,tnt2连接到tnt3等。您可能需要修复文件权限才能使用设备。
编辑:
我想我的热情有点快。 虽然司机看起来很有前途,但似乎不稳定。 我不知道,但我认为它在我从事家庭工作的办公室里碰到了一台机器。 星期一我回到办公室后,我无法检查。
第二件事是TIOCMIWAIT不起作用。 代码似乎是从一些“微小的tty”示例代码复制。 TIOCMIWAIT的处理似乎已经到位,但是它永远不会被唤醒,因为相应的wake_up_interruptible()调用丢失了。
编辑:
办公室的事故真的是司机的错。 没有初始化,完全未经testing的TIOCMIWAIT代码导致机器崩溃。
我昨天和今天改写了司机。 有很多问题,但现在对我来说很好。 驱动程序pipe理的硬件stream控制仍然缺less代码,但是我不需要它,因为我将使用用户模式代码中的TIOCMGET / TIOCMSET / TIOCMIWAIT自己pipe理引脚。
如果有人对我的代码版本感兴趣,给我发一条消息,我会把它发给你。
您可能想看看Tibbo VSPDL ,使用Kernel驱动程序创build一个linux虚拟串行端口 – 这看起来很新颖,现在可以下载(testing版)。 目前还不确定这个许可证,或者他们是否希望将来只能在商业上使用。
还有其他的商业select,例如http://www.ttyredirector.com/ 。
在开放源代码中, Remserial (GPL)也可以使用Unix PTY's来做你想做的事情。 它以“原始forms”将串行数据传输到networking套接字; terminal参数的STTY设置必须在创build端口时完成,稍后像RFC 2217中描述的那样改变它们似乎不被支持。 您应该能够运行两个remserial实例来创build像com0com这样的虚拟nullmodem,不过您需要提前设置端口速度等。
Socat (也称为 GPL)就像是Remserial的一个扩展变种,有很多更多的选项,其中包括一个用于将PTYredirect到别的东西的“PTY”方法,这可能是Socat的另一个实例。 对于单位tets,socat可能比remserial更好,因为你可以直接把文件转换成PTY。 请参阅联机帮助页上的PTY示例 。 补丁存在于“contrib”下面,以提供对协商串行线路设置的RFC2217支持。
使用前面答案中发布的链接,我使用虚拟串行端口在C ++中编写了一个小例子。 我把代码推入GitHub: https : //github.com/cymait/virtual-serial-port-example 。
代码是非常自我解释。 首先,通过运行./main master创build主进程,并打印到设备正在使用的stderr。 之后,调用./main从属设备,其中设备是在第一个命令中打印的设备。
就是这样。 您在这两个过程之间有一个双向链接。
使用这个例子,你可以通过发送所有types的数据来testing你的应用程序,看看它是否工作正常。
而且,您可以始终符号链接设备,因此您不需要重新编译正在testing的应用程序。
你可以使用USB-> RS232适配器吗? 我有一些,他们只是使用FTDI驱动程序。 然后,你应该能够把/ dev / ttyUSB0(或者其他的被创build的)重命名为/ dev / ttyS2。
我可以想到三个select:
实施RFC 2217
RFC 2217涵盖了TCP / IP标准的通讯协议,允许一个系统上的客户端模拟一个到本地程序的串行端口,同时透明地将数据和控制信号发送到另一个实际上具有该串行端口的系统上的服务器。 这是一个高层次的概述 。
你会做的是find或实现一个客户端COM端口驱动程序,将在您的PC上实现系统的客户端 – 似乎是一个真正的串行端口,但实际上穿梭所有服务器。 您可以从Digi,Lantronix等免费获得该驱动程序,以支持其真正的独立串行端口服务器。
然后,您可以在另一个程序中本地实现连接的服务器端 – 允许客户端根据需要连接并发出数据和控制命令。
这可能不是微不足道的,但RFC已经存在了,你可能会find一个开源项目来实现连接的一个或两个方面。
修改linux串口驱动程序
或者,Linux的串行端口驱动程序源代码已经可用。 拿那个,把硬件控制部分,并且有一个驱动运行两个/ dev / ttySx端口,作为一个简单的回送。 然后连接你的真正的程序到ttyS2和你的模拟器到其他ttySx。
在环回中使用两个USB < – >串行电缆
但现在最简单的事情呢? 在两个串口USB设备上花费40美元,将它们连接在一起(零调制解调器),实际上有两个真正的串行端口 – 一个用于你正在testing的程序,一个用于你的模拟器。
-亚当