6

我正在尝试学习如何编写将从 Linux 中的串行端口读取的 C 代码。我发现这里似乎是一个很好的教程。

我希望能够测试这段代码,所以我认为我需要一个串行端口,或者在读取上面的代码时写入串行端口的方法。

我正在使用 virtualbox 在我的 Mac 上将 Ubuntu 10.04 作为虚拟机运行。我的想法是建立一个虚拟串行连接并从主机写入来宾。希望像cat "Hello World" > /tmp/fake_serial在主机终端中一样简单,并且可以由上面链接中的程序读取。

这可能吗?我尝试使用虚拟盒添加串行端口,当我尝试执行上述命令时,我收到一条错误消息,提示我无法写入套接字。

我想到的第二个选项是使用类似minicom来宾操作系统内部的东西来连接说/dev/ttyS1和写消息,让我的代码同时读取。同样,假设波特率和其他设置都可以,这可能吗?

我没有很多使用串行端口的经验,所以我很感激任何关于最好方法的建议。提前致谢。

4

3 回答 3

6

所以为了让它工作,我只是在 VirtualBox 上添加了另一个 Ubuntu VM,并通过虚拟串行端口将两者连接在一起。我用于大量开发的主要原始 VM 将被称为 VM1。新的 VM 带有一个仅用于向 VM1 发送消息的小型硬盘驱动器,将被称为 VM2。这些都是 Ubuntu 10.04 虚拟机。

在 VirtualBox 中,转到 VM1 的设置,转到端口,然后按如下方式更改设置:VM1 设置

现在转到VM2,然后选择设置,端口,然后更改如下:

VM2 设置

现在首先您需要启动 VM1。启动后,启动 VM2。现在您可以在 VM1 中打开一个终端,然后输入screen /dev/ttyS0 38400(您可能需要sudo apt-get install screen在此工作之前运行)。然后转到 VM2,打开一个终端,然后键入echo "Hello" > /dev/ttyS0.

您应该会看到Hello出现在 VM1 中打开的终端中。当你完成运行 screen pressctrl-a k来杀死它,否则如果你尝试用串行端口做其他事情,你可能会收到一条错误消息,指出端口正忙。

于 2013-04-09T13:14:17.243 回答
1

当我不得不从我的真实机器到虚拟机进行一些串行端口测试时,我最终做了一个“环回”类型测试。我拿了两个USB 串行转换器和一个RS232 FF 适配器并将我的机器连接到自身。然后在设置-> USB 下的 VirtualBox 中,您可以将两个 USB 串行转换器之一路由到您的 VirtualBox“拥有”。

插入转换器后,一个将在 Mac 上注册,另一个在 Ubuntu“计算机”上注册,然后您可以在两台机器之间正常进行串行通信。

您也可以使用 pty(“伪电传”设备)模拟虚拟串行端口,但我对此并不积极,因为我相信这样做的能力已被锁定在较新的内核中。

于 2013-04-08T13:45:03.973 回答
1

我遇到了类似的情况,在 Ubuntu 14.04 主机上使用 VirtualBox 5.0.10 运行 QNX 来宾。

我的解决方案似乎足以适用于上述情况。

我以与 Kells1986 设置他的 VM1 相同的方式配置来宾 VM:

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

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

根据VirtualBox 手册

您可以告诉 VirtualBox 将虚拟串行端口连接到主机上的软件管道。... 在 Mac、Linux 或 Solaris 主机上,使用本地域套接字 ...在 Linux 上,有各种工具可以连接到本地域套接字或在服务器模式下创建一个。最灵活的工具是socat并且可以作为许多发行版的一部分使用。

Adomain socketUNIX 系统上的一种 IPC 机制,类似于管道。

我使用以下命令连接到 Ubuntu 主机上虚拟串行端口的“管道”端socat

socat - UNIX-CONNECT:/home/safayet/vmSerialPipe
于 2016-01-15T15:29:23.837 回答