首页 > 解决方案 > 创建一个假串行端口来模拟调制解调器

问题描述

我对 linux 编程及其基于文件的通信非常陌生。我需要在 linux 机器上创建一个虚拟调制解调器(或调制解调器模拟器)。这个想法是,向 FPGA 上的硬件调制解调器发送命令的软件模块,

在 FPGA 上:

SoftwareModule <= ttyACM => HardwareModem

我需要在我的计算机上实现的目标:

SoftwareModule <=> MyModemEmulator 就像一个假的 UART

目的是可以在我有一个假软件调制解调器 UART(?)端口的 linux 机器上测试软件模块。所以软件模块发送调制解调器命令,我的假调制解调器模块捕获并相应地响应。所以我的模块实际上就像一个硬件调制解调器。

我需要采取哪些步骤?我对使用串行端口很陌生,并且对 linux 或硬件知识没有深入的了解。

我遇到过“socat”,但我不确定这是否真的能达到目的。到目前为止,我只学习了如何使用 FUSE 创建一个基本的文件系统(正如有人建议的那样),但我不确定如何将它用于我的目的。我不是在寻找专有解决方案,也不是在寻找基于 Windows 的解决方案。
请指导我正确的方向。谢谢 !

标签: c++linuxserial-portembedded-linuxqemu

解决方案


创建一个假串行端口来模拟调制解调器

Linux中你所说的“串口”实际上是一个有很多软件层的串口终端。
研究Linux 串行驱动程序,以及需要模拟的显着功能的termios手册页。
而且您甚至没有考虑如何考虑通信路径的 USB 组件。

在 FPGA 上:

SoftwareModule <= ttyACM => HardwareModem
...
我的 ubuntu 电脑没有 ttyACM

仅当USB 串行小工具连接到主机时,才会创建/dev/ttyACM x 设备节点。
所以找不到这样的设备节点也就不足为奇了。

我需要在我的计算机上实现的目标:

SoftwareModule <=> MyModemEmulator 就像一个假的 UART

您对这个问题的表述很糟糕,因为您(错误地)认为“假 UART ”(与您的“MyModemEmulator”集成)是合适的解决方案。

不要试图在 Ubuntu 主机上同时模拟串行终端和外部调制解调器,因为您“对在 linux 和串行端口上编程还很陌生”,而准确模拟串行终端的任务既冒险又昂贵。
你的目标应该是:

软件模块 <= ? => 我的调制解调器模拟器

问题是“中间需要什么来连接这两个单元?”。
IOW 你发布了一个XY 问题


有大量的 SBC(单板计算机)具有 USB 小工具端口,并且可以配置为使用 CDC ACM 的 USB 串行小工具。
由于实际的“FPGA 上的硬件调制解调器”将使用 USB CDC ACM 连接,因此您应该考虑使用实际的/dev/ttyACM x 串行终端,并仅使用 SBC模拟外部设备(“硬件调制解调器” )。

换句话说,而不是试图实现:

SoftwareModule <=> MyModemEmulator + 假USB串口终端

使用现有接口和实现应该更容易:

SoftwareModule <= USB =>模拟HardwareModem

使用 SBC 运行您的 Linux 应用程序以使用/dev/ttyGS0(小工具端的 USB 串行终端)进行调制解调器仿真。
通过使用实际的 USB CDC ACM 连接而不实现“假 USB 串行终端”,这种方法消除了整个 SW+HW 仿真层及其可能的错误测试结果。


附录

如果您担心 SBC 上嵌入式 Linux 的使用和/或成本,那么有一个替代方案可以在您的 Ubuntu PC 主机上模拟“硬件调制解调器”,而不是使用 USB 到 RS232 到 USB 连接的 SBC .

  1. 购买一对(即 2 个)USB 转 RS232 适配器和一根(非常短的)零调制解调器电缆。

  2. 将适配器的 DB-9 端连接到 null-modem 电缆,形成一条两端都有 USB 公头 type-A 连接器的单根电缆。

  3. 将一个适配器插入 PC 以创建/dev/ttyUSB0设备节点。将其视为等同于/dev/ttyACM0SoftwareModule.

  4. 将另一个适配器插入 PC 以创建/dev/ttyUSB1设备节点。对于您的模拟“硬件调制解调器”,将此视为等效于/dev/ttyGS0

  5. 在 Ubuntu PC 主机上开发、执行和调试模拟的“硬件调制解调器” (无需“创建假串口”的不必要任务)。


推荐阅读