【问题标题】:Simulate serial port device using stdin and stdout使用标准输入和标准输出模拟串口设备
【发布时间】:2022-01-06 19:16:43
【问题描述】:

目前,我有一个桌面应用程序,用于通过串行端口接口读取和写入数据到专有硬件设备。该应用程序首先列出连接到计算机的串行 COM 设备,一旦选择了一个设备,就可以与应用程序进行交互以与相应的设备进行通信。我手头不再有这样的设备,但我仍然想使用该应用程序。

我已经开发了一个命令行实用程序,给定stdin 中的二进制消息,它会向stdout 发出相应的二进制回复(专有硬件设备将通过串行端口发送的相同回复)。让我们将此实用程序称为simulator

我如何设置一个虚拟串口以便应用程序可以检测到它,并且每当应用程序使用串口协议发送消息时,该消息被转发到simulatorsimulator' s 回复返回到桌面应用程序?

我使用的是带有 M1 CPU 的 Mac OS 12。我也对 Windows 10 上的解决方案持开放态度(优先级较低)。

我在 StackOverflow 上查看了可能与此类似的先前问题,但它们要么不完整,要么略有不同,没有明显的方法来推断我的实际问题的解决方案。

【问题讨论】:

  • 很可能您必须编写驱动程序(新的用户空间驱动程序之一)或使用外部硬件(例如两个相互连接的 USB 转串行适配器或自定义 USB-到串行实现)。
  • 这篇文章可能会有所帮助。 LINUX - ComPort over Network
  • 你试过用socat吗?
  • 嗨,我不熟悉编写驱动程序(也不熟悉用户或内核空间)或 socat。您能否就这些主题展开更多讨论?您能否提供一个小而有意义且有效的示例?
  • @RichardBarber OP 正在寻找一种解决方案来创建新的串行端口,因为旧应用程序需要一个串行端口。我不认为 socat 可以做到这一点。

标签: macos serial-port emulation


【解决方案1】:

串行端口不同于其他通道。这就是为它们存在单独的系统调用的原因。

通常,串行端口是由物理设备(老式串行端口或基于 USB 的新型串行端口)和相关驱动程序创建的。由于编写驱动程序相当困难,一个实用且可能出乎意料的方法是使用硬件,特别是两个 USB 到串行适配器。这样,USB 转串口适配器的驱动程序就会创建一个串口。

两个 USB 转串口适配器相互连接(RX 到 TX,反之亦然)。在 macOS 上将显示为两个串行端口 (/dev/cu.usb...)。

然后,旧应用程序连接到其中一个串行端口。并且您的命令行实用程序(充当设备仿真)连接到另一个串行端口。命令行实用程序发送的所有数据都将转到旧版应用程序,反之亦然。

剩下的问题是如何将命令行实用程序连接到串行端口。如果幸运的话,您可以使用 screen 命令。但更有可能的是,您需要修改它以从串行端口读取和写入(而不是 stdinstdout)。

【讨论】:

  • 感谢您的回答。我想我宁愿走驱动路径,而不是随身携带两个 USB 转串口适配器(加上从 USB-C 到 USB-A 的适配器)。你有这方面的资源吗?
  • 不,我不熟悉编写设备驱动程序。 Apple 几乎没有任何关于它的文档。
猜你喜欢
  • 1970-01-01
  • 2021-10-20
  • 2013-09-18
  • 2017-05-16
  • 2013-06-13
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
相关资源
最近更新 更多