首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Socat串口嗅探

Socat串口嗅探
EN

Stack Overflow用户
提问于 2016-08-10 08:44:29
回答 2查看 7.8K关注 0票数 4

目前,我正在尝试访问连接到应用程序的串行端口的两个方向的数据。

我想做的是:

ttymxc0 <

ttymxc0是真正的端口,ttyV0是虚拟端口。

我发现了在Ubuntu16.04:http://www.iheartrobotics.com/2010/02/debugginng-serial-interfaces.html上工作的socat命令

但是,当我使用buildroot在嵌入式系统上使用它时,我会得到以下错误:

代码语言:javascript
复制
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之间有什么不同,有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2022-01-12 14:40:10

你已经回答了你自己的问题,但这个稍微现代化的答案是:

代码语言:javascript
复制
$ 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“使终端rawer比raw选项更好。该选项隐式地关闭回显。”
  3. b115200“将串行线路速度设置为115200波特”,这是一个非常常见的设置。当然,为你的案子设置正确的。
票数 4
EN

Stack Overflow用户

发布于 2022-09-16 23:08:50

如果你对socat的-v输出格式很满意的话,迭戈的回答是很棒的。然而,如果你想要创建一个单独的设备,它只是一个像我这样的原始设备的只读版本,这样你就可以在只读设备上打开minicom,并让其他软件正常地与读写设备交互--我只是想出了以下几个很好的方法。

代码语言:javascript
复制
socat /dev/ttyUSB0,rawer SYSTEM:'tee >(socat - "PTY,link=/tmp/foobar-ro,rawer" >%-) | socat - "PTY,link=/tmp/foobar-rw,rawer,wait-slave"'

这很复杂,所以我会把它分解一下。从逻辑上讲是这样的:

代码语言:javascript
复制
socat /dev/ttyUSB3,rawer SYSTEM:'tee [READ-ONLY PTY] | [READ-WRITE PTY]'

它的工作原理大致相同:

  1. 第一套接字命令在第一地址(/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. 最后,使用与第二个类似的第三个socat命令创建[READ-WRITE PTY]。第三个套接字的标准输出成为第一个套接字中系统地址的输出,并输入到原始设备的输入,完成循环。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38868351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档