如何让 SOCAT 从 STDIO 发送每个字符?

如何让 SOCAT 从 STDIO 发送每个字符?

我有以下场景:

我的虚拟机中有一个 Windows,它有一个连接到主机管道(命名管道/fifo)的公开串行端口。

主管道位于/tmp/win-serial-com3

在我的主机操作系统上,我正在使用socat像这样:

socat - /tmp/win-serial-com3,cr

来宾,我开油灰,并设置“在每个CR中隐式LF”,并启用本地回显。 PuTTY 在该来宾 Windows 上打开 COM3。

两者都运行时,返回键工作正常,没有重复等。我可以在 PuTTY 中键入,我可以看到每个字符一个接一个地出现在正在socat运行的主机操作系统的终端中。

但是,当我在主机操作系统中输入某些内容时,我可以看到本地回显(因为它没有通过echo=0选项关闭),但只有在按回车键后,该字符才会出现在我的来宾操作系统上的 PuTTY 中。

我希望发生的是,每次按下某个键时,该键都会发送到命名管道,本质上与来宾操作系统上的 PuTTY 具有相同的行为。

我认为这与 STDIO ( ) 的缓冲有关-,但我不太确定。

答案1

好的,我找到了解决方案,并且经过了相当多的尝试和错误:

在主机端(Linux),socat调用方式如下:

stty -icanon && socat - /tmp/win-serial-com3,cr

在来宾端,必须使用“每个 CR 中的隐式 LF”来调用 PuTTY,并在“终端”设置中取消设置“每个 LF 中的隐式 CR”。

这仍然不理想。

当我按backspace主机端时,它会打印一个^?,而不是删除前一个字符。在访客方面,这工作正常。当按下backspace来宾端时,它会删除来宾端的字符,但不会删除主机端的字符。我还没有找到工作的方法backspace

相关内容