Virtualbox下主机和客户机之间的串口连接

6
我试图学习如何编写C代码以从Linux的串口读取数据。我找到了这个看起来不错的教程(这里)
我想要测试这段代码,所以我认为我需要一个串口,或者一种在上述代码读取时写入串口的方法。
我在我的Mac上使用virtualbox运行Ubuntu 10.04虚拟机。我的想法是设置一个虚拟串口连接,并从主机向客户端写入。希望在主机终端中输入类似cat "Hello World" > /tmp/fake_serial这样的简单命令,然后程序能够读取链接中的内容。
这是可能的吗?我尝试使用virtualbox添加串口,但当我尝试执行上述命令时,出现错误提示无法写入套接字。
我想到的第二个选择是在客户端操作系统中使用类似minicom的东西,连接到例如/dev/ttyS1并写入消息,让我的代码同时读取。假设波特率和其他设置都正确,这种方法可行吗?
我没有很多使用串口的经验,所以我希望能得到关于最佳方法的任何建议。谢谢。
3个回答

6
为了让这个工作正常运行,我在VirtualBox上添加了另一个Ubuntu虚拟机,并通过虚拟串口将两个虚拟机连接在一起。我主要使用于开发的原始VM将被称为VM1。新的VM,具有仅用于向VM1发送消息的小硬盘,将被称为VM2。这些都是Ubuntu 10.04 VM。
在VirtualBox中,转到VM1的设置,转到端口,然后更改设置如下:
现在转到VM2,选择设置、端口,然后更改如下:
现在,首先需要启动VM1。当它启动后再启动VM2。现在你可以在VM1中打开终端,输入screen /dev/ttyS0 38400(在此之前您可能需要运行sudo apt-get install screen)。然后转到VM2,打开终端,输入echo "Hello" > /dev/ttyS0
您应该会在VM1中打开的终端中看到Hello出现。当您完成运行screen时,按ctrl-a k来杀死它,否则如果您尝试使用串行端口进行其他操作,则可能会收到一个错误消息,指示端口正忙。

3
谢谢。那正是我一直在寻找的:D 我只有一个问题:是否有办法仅使用一个虚拟机,并使用主机来写入管道? - webNeat
只要我在screen命令前加上sudo,这对我来说就可以工作了:“sudo screen /dev/ttyS0 38400”。 - Gardener

1

我遇到了一个类似的情况,在Ubuntu 14.04主机上使用VirtualBox 5.0.10运行QNX客户端。我的解决方案似乎足够普遍,适用于上述情况。

我按照Kells1986设置VM1的方式配置了客户端虚拟机:

在“串口”/“端口1”选项卡下:

  • 勾选“启用串口”
  • 将“端口号”设置为“COM1”
  • 将“Irq”设置为“4”
  • 将“I/O端口”设置为“0x3F8”
  • 将“端口模式”设置为“主机管道”
  • 取消勾选“连接到现有的管道/套接字”
  • 将“路径/地址”设置为可访问的文件系统路径(例如“/home/safayet/vmSerialPipe”)

根据VirtualBox手册

你可以告诉VirtualBox将虚拟串口连接到主机上的软件管道。...在Mac、Linux或Solaris主机上,会使用本地域套接字...在Linux上,有各种工具可以连接到本地域套接字或以服务器模式创建本地域套接字。最灵活的工具是socat,并且作为许多发行版的一部分提供。 域套接字是类似于管道的UNIX系统上的IPC机制
我使用socat命令连接到Ubuntu主机上的虚拟串口的“管道”端。
socat - UNIX-CONNECT:/home/safayet/vmSerialPipe

如何从(Linux)主机连接到客户串口 - 这正是我正在寻找的。 - CivFan

1
当我需要从我的真实机器到虚拟机执行一些串口测试时,最终我进行了“回环”类型的测试。我拿了两个USB-Serial转换器和一个RS232 F-F适配器,将我的机器连接到自己。然后在VirtualBox中,在“设置”->“USB”下,您可以将两个USB-Serial转换器中的一个路由到您的VirtualBox所“拥有”。
一旦你插上转换器,其中一个将在Mac上注册,另一个将在Ubuntu的“计算机”上注册,然后你可以像正常情况下一样在两台机器之间进行串行通信。
你还可以使用pty(“伪电报机”设备)来模拟虚拟串口,但我不确定这是否可行,因为我认为在更新的内核中锁定了此功能。

谢谢你的建议,不过我没有必要的适配器,所以我自己想出了一种解决办法。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接