Jef*_*ffV 111 linux serial-port virtual-serial-port
我需要在Linux上测试串口应用程序,但是,我的测试机只有一个串口.
有没有办法向Linux添加虚拟串口并通过shell或脚本模拟设备来测试我的应用程序?
注意:我无法重新映射端口,它在ttys2上硬编码,我需要在编写时测试应用程序.
can*_*oni 140
补充了@ slonik的答案.
您可以测试socat以创建虚拟串行端口,执行以下过程(在Ubuntu 12.04上测试):
打开终端(让我们称之为终端0)并执行它:
socat -d -d pty,raw,echo=0 pty,raw,echo=0
Run Code Online (Sandbox Code Playgroud)
上面的代码返回:
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]
Run Code Online (Sandbox Code Playgroud)
打开另一个终端并写入(终端1):
cat < /dev/pts/2
Run Code Online (Sandbox Code Playgroud)
此命令的端口名称可以根据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
Run Code Online (Sandbox Code Playgroud)
你应该使用突出显示区域的可用数字.
打开另一个终端并写入(终端2):
echo "Test" > /dev/pts/3
Run Code Online (Sandbox Code Playgroud)
现在回到1号航站楼,你会看到字符串"Test".
ape*_*arr 72
您可以使用pty("伪电传类型",其中串行端口是"真正的电传打字机").从一端打开/dev/ptyp5
,然后将程序附加到/dev/ttyp5
; ttyp5
将像串行端口一样,但将通过/ dev/ptyp5发送/接收它所做的一切.
如果你真的需要它跟一个叫文件/dev/ttys2
,然后简单地将您的旧/dev/ttys2
的方式进行,并从做一个符号链接ptyp5
到ttys2
.
当然你可以使用除了之外的一些数字ptyp5
.也许选择一个高数字以避免重复,因为您的所有登录终端也将使用ptys.
维基百科有更多关于ptys的信息:http://en.wikipedia.org/wiki/Pseudo_terminal
slo*_*nik 42
使用socat:
例如:
socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11
Run Code Online (Sandbox Code Playgroud)
Pet*_*ers 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
Run Code Online (Sandbox Code Playgroud)
加载模块时,会创建4对串行端口.设备是/ dev/tnt0到/ dev/tnt7,其中tnt0连接到tnt1,tnt2连接到tnt3等.您可能需要修复文件权限才能使用设备.
编辑:
我想我的热情有点快.虽然司机看起来很有希望,但似乎不稳定.我不确定,但我认为它在我在家工作的办公室里撞坏了一台机器.我不能检查,直到我星期一回到办公室.
第二件事是TIOCMIWAIT不起作用.代码似乎是从一些"微小的tty"示例代码中复制而来的.TIOCMIWAIT的处理似乎已经到位,但它永远不会被唤醒,因为缺少对wake_up_interruptible()的相应调用.
编辑:
办公室的崩溃确实是司机的错.缺少初始化,完全未经测试的TIOCMIWAIT代码导致机器崩溃.
我昨天和今天都在重写驱动程序.有很多问题,但现在它适用于我.由驱动程序管理的硬件流控制仍然缺少代码,但我不需要它,因为我将使用TIOCMGET/TIOCMSET/TIOCMIWAIT从用户模式代码自己管理引脚.
如果有人对我的代码版本感兴趣,请给我发消息,然后我会发给你.
小智 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示例."contrib"下存在一个补丁,用于为协商串行线路设置提供RFC2217支持.
我可以想到三个选择:
RFC 2217涵盖了 TCP/IP 标准的 com 端口,该标准允许一个系统上的客户端模拟本地程序的串行端口,同时透明地向另一个系统上实际具有串行端口的服务器发送和接收数据和控制信号。这是一个高级概述。
您要做的就是找到或实现一个客户端 com 端口驱动程序,该驱动程序将在您的 PC 上实现系统的客户端 - 看起来是一个真正的串行端口,但实际上将所有内容传送到服务器。您可以从 Digi、Lantronix 等公司免费获得此驱动程序,以支持他们真正的独立串口服务器。
然后,您可以在另一个程序中本地实现连接的服务器端 - 允许客户端连接并根据需要发出数据和控制命令。
这可能并不简单,但 RFC 就在那里,您也许能够找到一个实现连接一侧或两侧的开源项目。
或者,Linux 的串行端口驱动程序源也很容易获得。以此为基础,对硬件控制部分进行内部处理,并让一个驱动程序运行两个 /dev/ttySx 端口,作为一个简单的环回。然后将您的真实程序连接到 ttyS2,将模拟器连接到另一个 ttySx。
但现在最容易做的事情是什么?花 40 美元购买两个串行端口 USB 设备,将它们连接在一起(空调制解调器),实际上有两个真正的串行端口 - 一个用于您正在测试的程序,一个用于您的模拟器。
-亚当
使用前面答案中发布的链接,我使用虚拟串行端口在C++中编写了一个小例子.我将代码推送到GitHub:https://github.com/cymait/virtual-serial-port-example.
代码非常自我解释.首先,通过运行./main master创建主进程,它将打印到设备正在使用的stderr.之后,您调用./main从属设备,其中device是在第一个命令中打印的设备.
就是这样.您在两个进程之间有双向链接.
使用此示例,您可以通过发送所有类型的数据来测试应用程序,并查看它是否正常工作.
此外,您始终可以对设备进行符号链接,因此您无需重新编译正在测试的应用程序.
$ socat -d -d pty,link=/tmp/vserial1,raw,echo=0 pty,link=/tmp/vserial2,raw,echo=0
Run Code Online (Sandbox Code Playgroud)
/tmp/vserial1
将为/tmp/vserial2
生成的虚拟串行端口生成符号链接/dev/pts/*
您可以使用 USB->RS232 适配器吗?我有一些,他们只使用 FTDI 驱动程序。然后,您应该能够将 /dev/ttyUSB0 (或创建的任何内容)重命名为 /dev/ttyS2 。