Linux 的虚拟串行端口

2024-10-10 08:38:00
admin
原创
206
摘要:问题描述:我需要在Linux上测试一个串行端口应用程序,但是我的测试机器只有一个串行端口。有没有办法向 Linux 添加虚拟串行端口并通过 shell 或脚本模拟设备来测试我的应用程序?注意:我无法重新映射端口,它在 ttys2 上硬编码,我需要按照编写的方式测试应用程序。解决方案 1:补充@slonik 的...

问题描述:

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

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

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


解决方案 1:

补充@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

此命令的端口名称可以根据电脑而改变。这取决于前面的输出。

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”。

解决方案 2:

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

如果您确实需要它与名为 的文件对话/dev/ttys2,那么只需将旧文件移开/dev/ttys2并创建一个从ptyp5到 的符号链接ttys2

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

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

解决方案 3:

使用 socat 来实现这一点:

例如:

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

解决方案 4:

还有 tty0tty http://sourceforge.net/projects/tty0tty/,它是 Linux 的真正的空调制解调器模拟器。

它是一个简单的内核模块 - 一个很小的源文件。我不知道为什么它在 sourceforge 上只被否决,但它对我来说很好用。最好的一点是它还模拟了硬件引脚(RTC/CTS DSR/DTR)。它甚至实现了 TIOCMGET/TIOCMSET 和 TIOCMIWAIT iotcl 命令!

在较新的内核上,您可能会遇到编译错误。这很容易修复。只需在 module/tty0tty.c 源代码的顶部(includes 之后)插入几行即可:

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

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

编辑:

我想我的热情有点太快了。虽然驱动程序看起来很有希望,但它似乎不稳定。我不确定,但我认为它使我在家工作的办公室里的一台机器崩溃了。我只能等到周一回到办公室才能检查。

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

编辑:

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

我花了昨天和今天的时间重写了驱动程序。有很多问题,但现在对我来说效果很好。驱动程序管理的硬件流控制仍然缺少代码,但我不需要它,因为我将使用用户模式代码中的 TIOCMGET/TIOCMSET/TIOCMIWAIT 自己管理引脚。

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

解决方案 5:

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

还有其他商业替代品,例如http://www.ttyredirector.com/

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

Socat(也是 GPL)就像是 Remserial 的扩展版本,具有更多选项,包括用于将 PTY 重定向到其他位置的“PTY”方法,可以是 Socat 的另一个实例。对于 Unit tets,socat 可能比 remserial 更好,因为您可以直接将文件 cat 到 PTY 中。请参阅手册页上的PTY 示例。“contrib”下有一个补丁,用于为协商串行线路设置提供 RFC2217 支持。

解决方案 6:

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

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

就是这样。两个过程之间有双向链接。

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

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

解决方案 7:

$ socat -d -d pty,link=/tmp/vserial1,raw,echo=0 pty,link=/tmp/vserial2,raw,echo=0

将生成生成的虚拟串行端口的/tmp/vserial1符号/tmp/vserial2链接/dev/pts/*

资源

解决方案 8:

您能使用 USB->RS232 适配器吗?我有几个,它们只使用 FTDI 驱动程序。然后,您应该能够将 /dev/ttyUSB0(或任何创建的)重命名为 /dev/ttyS2 。

解决方案 9:

我能想到三种选择:

实施 RFC 2217

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

您要做的就是找到或实现一个客户端 com 端口驱动程序,该驱动程序将在您的 PC 上实现系统的客户端 - 看起来像是一个真正的串行端口,但实际上将所有东西都传送到服务器。您可能能够从 Digi、Lantronix 等免费获得此驱动程序,以支持他们真正的独立串行端口服务器。

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

这可能并不简单,但是 RFC 就在那里,您也许能够找到一个实现连接一侧或两侧的开源项目。

修改linux串口驱动

另外,Linux 的串行端口驱动程序源很容易获得。利用它,删除硬件控制部分,让一个驱动程序运行两个 /dev/ttySx 端口,作为简单的回送。然后将您的实际程序连接到 ttyS2,将您的模拟器连接到另一个 ttySx。

在环回中使用两根 USB<-->串行电缆

但现在最简单的做法是什么?花 40 美元购买两个串行端口 USB 设备,将它们连接在一起(空调制解调器),这样实际上就有两个真正的串行端口 - 一个用于您正在测试的程序,一个用于您的模拟器。

—亚当

解决方案 10:

结合所有其他非常有用的答案,我发现以下命令对于在不同类型的 Linux 发行版上进行测试非常有用,因为无法保证每次都会获得相同的 /dev/pts/#和/或您需要同时测试多个伪串行设备和连接。

parallel &#039;i=&quot;{1}&quot;; socat -d -d pty,raw,echo=0,link=$HOME/pty{1} pty,raw,echo=0,link=$HOME/pty$(($i+1))&#039; ::: $(seq 0 2 3;)

具体来说:

parallel对提供给它的每个参数运行相同的命令。例如,如果我们使用--dryrun它给出的标志来运行它:

i=&quot;0&quot;; socat -d -d pty,raw,echo=0,link=$HOME/pty0 pty,raw,echo=0,link=$HOME/pty$(($i+1))
i=&quot;2&quot;; socat -d -d pty,raw,echo=0,link=$HOME/pty2 pty,raw,echo=0,link=$HOME/pty$(($i+1))

这是因为$(seq x y z;)在末尾,x = 起始编号,y = 增量,z = 结束编号(或需要生成的设备编号)

parallel &#039;i=&quot;{1}&quot;; echo &quot;make psuedo_devices {1} $(($i+1))&quot;&#039; ::: $(seq 0 2 3;)

输出:

make psuedo_devices 0 1
make psuedo_devices 2 3

将所有这些放在一起,上面的最终命令将正确的伪设备符号链接在一起,无论 /dev/pts/ 中有什么,都链接到通过标志提供给 socat 的任何目录link

pstree -c -a $PROC_ID给出:

perl /usr/bin/parallel i=&quot;{1}&quot;; socat -d -d pty,raw,echo=0,link=$HOME/pty{1} pty,raw,echo=0,link=$HOME/pty$(($i+1)) ::: 0 2
  ├─bash -c i=&quot;0&quot;; socat -d -d pty,raw,echo=0,link=$HOME/pty0 pty,raw,echo=0,link=$HOME/pty$(($i+1))
  │   └─socat -d -d pty,raw,echo=0,link=/home/user/pty0 pty,raw,echo=0,link=/home/user/pty1
  └─bash -c i=&quot;2&quot;; socat -d -d pty,raw,echo=0,link=$HOME/pty2 pty,raw,echo=0,link=$HOME/pty$(($i+1))
      └─socat -d -d pty,raw,echo=0,link=/home/user/pty2 pty,raw,echo=0,link=/home/user/pty3

ls -l $HOME/pty* 收益:

lrwxrwxrwx 1 user user 10 Sep  7 11:46 /home/user/pty0 -> /dev/pts/4
lrwxrwxrwx 1 user user 10 Sep  7 11:46 /home/user/pty1 -> /dev/pts/6
lrwxrwxrwx 1 user user 10 Sep  7 11:46 /home/user/pty2 -> /dev/pts/7
lrwxrwxrwx 1 user user 10 Sep  7 11:46 /home/user/pty3 -> /dev/pts/8

这一切都是因为我试图在一个平台上运行测试,在这个平台上我需要生成大量的 mach-serial 连接并通过容器化 (Docker) 测试它们的输入/输出。希望有人觉得它有用。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1572  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   0  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   0  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用