c++ - 创建一个假串行端口来模拟调制解调器
问题描述
我对 linux 编程及其基于文件的通信非常陌生。我需要在 linux 机器上创建一个虚拟调制解调器(或调制解调器模拟器)。这个想法是,向 FPGA 上的硬件调制解调器发送命令的软件模块,
在 FPGA 上:
SoftwareModule <= ttyACM => HardwareModem
我需要在我的计算机上实现的目标:
SoftwareModule <=> MyModemEmulator 就像一个假的 UART
目的是可以在我有一个假软件调制解调器 UART(?)端口的 linux 机器上测试软件模块。所以软件模块发送调制解调器命令,我的假调制解调器模块捕获并相应地响应。所以我的模块实际上就像一个硬件调制解调器。
我需要采取哪些步骤?我对使用串行端口很陌生,并且对 linux 或硬件知识没有深入的了解。
我遇到过“socat”,但我不确定这是否真的能达到目的。到目前为止,我只学习了如何使用 FUSE 创建一个基本的文件系统(正如有人建议的那样),但我不确定如何将它用于我的目的。我不是在寻找专有解决方案,也不是在寻找基于 Windows 的解决方案。
请指导我正确的方向。谢谢 !
解决方案
创建一个假串行端口来模拟调制解调器
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 .
购买一对(即 2 个)USB 转 RS232 适配器和一根(非常短的)零调制解调器电缆。
将适配器的 DB-9 端连接到 null-modem 电缆,形成一条两端都有 USB 公头 type-A 连接器的单根电缆。
将一个适配器插入 PC 以创建/dev/ttyUSB0设备节点。将其视为等同于/dev/ttyACM0的
SoftwareModule
.将另一个适配器插入 PC 以创建/dev/ttyUSB1设备节点。对于您的模拟“硬件调制解调器”,将此视为等效于/dev/ttyGS0。
在 Ubuntu PC 主机上开发、执行和调试模拟的“硬件调制解调器” (无需“创建假串口”的不必要任务)。
推荐阅读
- postgresql - 事务更新后的条件插入
- firebase - 将 Firebase 依赖项添加到 yaml 文件会导致构建失败
- c# - 以正确的速度显示动画 GIF
- angular - 如何创建具有至少 3 级项目树的复杂 Angular 库
- python - 将输出存储到一个列表中
- r - 将每次迭代存储在梯度下降函数中,以便可视化参数更新过程,以及 r 中的成本覆盖过程
- javascript - 上下滚动时淡入淡出
- amazon-web-services - 在 DynamoDB 中查询具有回退到默认值的键
- python - 运行简单的转换器来测试 NER 会导致错误。有什么解决办法吗?
- visual-studio-code - vscode 调试器在调试时无法正确定位 Rust 源代码