如何监听进程和串口之间的通信?

Ale*_*lex 5 serial-port

在 Gentoo Linux 机器上,一个进程通过串行端口 ( /dev/ttyS1)与另一台计算机通信。我想在不进一步干扰的情况下收听此通信(即进程发送/接收的内容)。

如何仅使用基本的 Linux 工具来实现这一目标?我什至可以更改进程正在与之通信的串行端口,所以也许我可以“快捷地”两个设备(/dev/ttyS1/dev/xxx)侦听所有通信,当所有输出/dev/ttyS1都转发到时/dev/xxx,反之亦然。但是我该怎么做呢?有什么socat

X T*_*ian 10

拦截看起来像你想要的。

我发现从这个Ubuntu 页面

拦截 - 拦截进出串行端口的流量。

例子

如果您想将拦截用作外部串行监视器[连接到您机器上的两个串行端口并在它们之间进行中继,同时记录输出]

您可以使用一台设备作为后端,并使用 -p 选项告诉前端不要创建它自己的 tty,而只需使用您告诉它的那个:

interceptty -s 'ispeed 19200 ospeed 19200' /dev/ttyS0 -p /dev/ttyS1 -
Run Code Online (Sandbox Code Playgroud)

输出

拦截以一种相当不吸引人的、令人痛苦的格式打印其输出。但是,其他程序很容易解析。有关如何将此输出后处理为适合您拦截的任何内容的示例,请参阅包含的 Perl 脚本interceptty-nicedump。

输出行采用以下通用格式:

< 0x54 (T)

  0x4b (K)  ^ Direction    ^^^^ Hex code (to real device)
    ^^^ ASCII character (to real device)
     ^^^^ Hex code (from real device)
          ^^^ ASCII character (from real device) The direction marker is a '<' if this character was sent to the backend device, and
Run Code Online (Sandbox Code Playgroud)

'>' 如果它是从后端设备收到的。它后面总是跟一个空格。如果字符是从真实设备接收的,接下来会出现一个选项卡(这使得输出更容易理解)。之后是字符的十六进制代码,如果是 ASCII 字符,则是字符的 ASCII 表示。


Hau*_*ing 4

一种方法(不一定是最好的...)是附加strace到进程(或者,为了处理竞争条件,附加到该exec进程的包装脚本),设置strace最大字符串长度,然后捕获所有read()s和write()s (或您的流程使用的任何内容)。之后,您使用正确的文件描述符(应该始终相同;如果不是,那么您open()也必须捕获 s)来 grep 行。