使用stdin和stdout模拟串口设备

问题描述 投票:0回答:2

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

我已经开发了一个命令行实用程序,给定

stdin
中的二进制消息,它会向
stdout
发出相应的二进制回复(与专有硬件设备通过串行端口发送的回复相同)。我们将此实用程序称为
simulator

如何设置虚拟串行端口,以便应用程序可以检测到它,并且每当应用程序使用串行端口协议发送消息时,该消息都会转发到

simulator
,以及
simulator
的回复返回桌面应用程序了吗?

我使用的是带有 M1 CPU 的 Mac OS 12。我也愿意接受 Windows 10 上的解决方案(优先级较低)。

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

macos serial-port emulation
2个回答
1
投票

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

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

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

/dev/cu.usb...
)。

遗留应用程序然后连接到串行端口之一。您的命令行实用程序(充当设备模拟)连接到另一个串行端口。命令行实用程序发送的所有数据都将发送到旧应用程序,反之亦然。

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


0
投票

使用 Apple Silicon M1 CPU 在 Mac OS 13 上创建虚拟串口。

打开终端并执行它:

socat -d -d pty,raw,echo=0 pty,raw,echo=0

上面的代码返回类似:

2023/08/18 23:12:40 socat[98468] N PTY is /dev/ttys002
2023/08/18 23:12:40 socat[98468] N PTY is /dev/ttys003
2023/08/18 23:12:40 socat[98468] N starting data transfer loop with FDs 
[5,5] and [7,7]

本质上,它创建两个虚拟串行端口并将它们连接起来,从而实现它们之间的双向通信(/dev/ttys002/dev/ttys003)。例如,我使用此命令允许 Arduino 模拟器通过串行端口与处理应用程序进行通信。

*所有积分均归于https://stackoverflow.com/a/19733677/953287

© www.soinside.com 2019 - 2024. All rights reserved.