我该如何在Linux上监控串口数据?

27

我正在调试与串行设备的通信,需要查看所有数据来回流动的情况。

在Linux中,串行端口表示为文件,因此似乎应该很容易实现这点。有没有一种方法可以进行“双向tee”,我让我的程序连接到一个管道,将数据复制到文件并传输到/从实际的串行端口设备?

我甚至认为我知道如何编写这样的程序,但这貌似是个不容易的问题,特别是要通过端口配置等操作传递所有的IO控制命令。

是否已经有人构建了这样的东西?这似乎太有用了(对于调试串行设备驱动程序的人们)而不可能不存在。


1
这可能会引起那些对给定答案感到困惑的人的兴趣:http://unix.stackexchange.com/questions/12359/how-can-i-monitor-serial-port-traffic - geekboyUK
问题也在http://serverfault.com/questions/112957/sniff-serial-port-on-linux 上。 - Cristian Ciupitu
5个回答

23

strace非常有用。您可以可视化所有ioctl调用,并解码相应的结构体。以下选项在您的情况下似乎特别有用:

-e read=set

对于指定集合中列出的文件描述符,执行完整的十六进制和ASCII转储以查看所有读取的数据活动。例如,要查看文件描述符3和5上的所有输入活动,请使用-e read=3,5。请注意,这与read(2)系统调用的正常跟踪是独立的,该跟踪受-e trace=read选项控制。

-e write=set

对于指定集合中列出的文件描述符,执行完整的十六进制和ASCII转储以查看所有写入的数据活动。例如,要查看文件描述符3和5上的所有输出活动,请使用-e write=3,5。请注意,这与write(2)系统调用的正常跟踪是独立的,该跟踪受-e trace=write选项控制。


太好了,谢谢!我知道一定有一个简单的方法来做这件事。我经常使用strace,但甚至没有考虑过它可以用于这个问题。 - divegeek
4
好的。但我想知道:我该如何找出相关文件描述符的编号? - Craig McQueen

4
我发现pyserial非常易用,如果你熟悉Python的话,写这样的东西应该不太难。

2
一个简单的方法是编写一个应用程序,它打开pty的主端口和待测tty。然后,您可以将pty的从端口作为“tty设备”传递给您的tty应用程序。
您需要使用tcgetattr()监视pty主设备的属性,并在属性更改时在真实tty上调用tcsetattr().
其余部分则是在两个fd上进行简单的select(),双向复制数据并将其复制到日志中。

如何监视使用 tcsetattr() 进行的更改事件?它们是否可以通过使用 select 进行监听来报告? - dolmen
tty驱动程序(以及操作系统)只与输入和输出的select()响应有约定。最简单的方法是在成功的select调用之后,在处理任何输入/输出之前调用tcgetattr()。 - codeDr

2
我看了很多串口嗅探器。它们都基于创建虚拟串口并从该端口嗅探数据的想法。但是,任何波特率/奇偶校验/流控制的更改都会中断连接。
因此,我写了自己的嗅探器:)。现在,大多数串口都只是USB转串口转换器。我的嗅探器通过debugfs从USB收集数据,解析并输出到控制台。同时,也记录了任何波特率更改、流控制、线路事件和串行错误。该项目处于早期开发阶段,目前仅支持FTDI。
链接:http://code.google.com/p/uscmon/

这看起来很有趣。如果您能更新以使用任何 vid/pid 并告知如何更改它,那就太好了! - not2qubit
最好有一个Makefile。 - nhed
另一个位置在这里(https://github.com/after5cst/uscmon),问题讨论有助于构建它,但似乎并没有实际工作。@MBR,您是否有更新版本或文档? - nhed

0
@MBR一样,我也在研究串行嗅探器,但是使用pty时会导致奇偶校验失败。然而,他的嗅探器对我没有帮助,因为我使用的是CP2102而不是FT232。所以我按照this的方法编写了自己的嗅探器,现在我有了一个可以记录任意文件I/O的工具:我把它叫做tracie

“记录任意文件的文件I/O”是什么意思?你是指“在任意文件中记录串行I/O”吗?还是其他什么意思? - Peter Mortensen
好的,我们可能永远不会知道。楼主可能已经离开了:“上次出现超过1年前”。也许通过其他方式? - Peter Mortensen

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