Socat串口嗅探

4
我正在尝试访问连接到应用程序的串行端口的双向数据。我想做的是:ttymxc0 <-----> socat嗅探器 <------> ttyV0 <------> 应用程序。ttymxc0是实际的端口,ttyV0是虚拟端口。
我发现在Ubuntu 16.04上有效的socat命令: http://www.iheartrobotics.com/2010/02/debugginng-serial-interfaces.html 但是当我在使用buildroot的嵌入式系统上使用它时,我会得到以下错误:
socat -d /dev/ttymxc0,raw,echo=0 SYSTEM:'tee input.txt | socat - "PTY,link=/tmp/ttyV0,raw,echo=0,waitslave" | tee output.txt'
 socat[3167.1996369920] E address "GOPEN..." in intermediate context, leftdirs=4, rightdirs=7, with 1 parameter(s) is not available
 socat[3167.1996369920] W cannot restore terminal settings on fd 3: Bad file descriptor

我试图查看文件的访问属性,但没有成功。如果不要求打印输入输出,它是有效的,但这对我的使用来说没有用处。

有什么想法可以解释为什么在buildroot和Ubuntu中会有差异?


3
使用以下命令解决:socat -x /dev/ttymxc0,raw,echo=0,crnl PTY,link=/dev/ttyV1,raw,echo=0,crnl,该命令可直接将内容输出到终端。 - Adraub
2个回答

6

你已经回答了自己的问题,以下是稍微现代化一些的答案:

$ socat -x -v /dev/ttyUSB0,rawer,b115200,crnl PTY,link=ttyV1,rawer,crnl
< 2022/01/12 15:34:47.845709  length=11 from=0 to=10
 65 63 68 6f 20 48 65 6c 6c 6f 0a                 echo Hello.
--
> 2022/01/12 15:34:47.847937  length=12 from=0 to=11
 65 63 68 6f 20 48 65 6c 6c 6f 0d 0a              echo Hello..
--
> 2022/01/12 15:34:47.876068  length=7 from=12 to=18
 48 65 6c 6c 6f 0d 0a                             Hello..
--
> 2022/01/12 15:34:47.905274  length=1 from=19 to=19
 24                                               $
--

来自socat手册:

  1. -v "将传输的数据不仅写入它们的目标流,而且还写入stderr。 输出格式是文本,并具有一些可读性转换,以及带有表示流方向的"> "或"< "前缀."
  2. raw已过时,rawer“比原始选项更加原始,此选项隐式关闭回显。”
  3. b115200"将串行线速度设置为115200波特率",这是相当常见的设置。 当然,根据您的情况设置正确的选项。

WTF?零票?你根本不知道我可以用多久!你有没有通过gdb通过串行调试内核,然后由于gdb尝试通过串行远程协议解释消息而无法看到消息,导致它恐慌kgdb并重新启动? gdb没有记录它的功能。 - Daniel Santos
我在 macOS 上进行了测试,表现还不错。 - Muthukumar Anbalagan

1

如果你对socat的-v输出格式满意,Diego的回答非常好。然而,如果你更喜欢创建一个只读版本的独立设备,就像我自己一样 - 比如说,这样你可以在只读设备上打开minicom,并让其他软件正常地与可读写设备交互 - 我刚刚想到了以下的解决方案,效果很好。

socat /dev/ttyUSB0,rawer SYSTEM:'tee >(socat - "PTY,link=/tmp/foobar-ro,rawer" >%-) | socat - "PTY,link=/tmp/foobar-rw,rawer,wait-slave"'

这有点复杂,所以我会稍微分解一下。逻辑上来说是这样的:

socat /dev/ttyUSB3,rawer SYSTEM:'tee [READ-ONLY PTY] | [READ-WRITE PTY]'

它大致的工作原理如下:

  1. 第一个 socat 命令在第一个地址(/dev/ttyUSB0)和第二个地址(SYSTEM 命令)之间建立了一个双向管道。
  2. 现在在 SYSTEM 命令中,tee 将其 stdin(即 /dev/ttyUSB0 的输出)复制到 [READ-ONLY PTY] 和自己的 stdout,然后我们将其管道传输到 [READ-WRITE PTY]
  3. [READ-ONLY PTY] 是通过第二个 socat 命令创建的,其中第一个地址是 -(socat 的 STDIO 地址类型的速记),第二个地址是新的 PTY。我们还确保使用 >%- 关闭此第二个 socat 命令的 stdout;这就是使其只读的原因。
    • 由于某种我不太理解的原因,除非关闭第二个 socat 的 stdout,否则 tee 似乎会在其自己的输出中包含进程替换的输出。我不确定为什么 tee 会从其参数中读取。
  4. 最后,[READ-WRITE PTY] 是通过类似于第二个 socat 的第三个 socat 命令创建的。这第三个 socat 的 stdout 成为第一个 socat 中 SYSTEM 地址的输出,并被馈送到原始设备的输入,完成循环。

感谢您的指令。在我的设置中,完整的指令无法工作,但我将其分成了两个脚本:#!/usr/bin/env bash tee >(socat - "PTY,link=$HOME/console-ro,rawer" >%-) | socat - "PTY,link=$HOME/console-rw,rawer"和指令:socat <serial>,rawer SYSTEM:<script> - Andrei Emeltchenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接