it-swarm.cn

如何监视串行端口流量?

是否有任何端口监视工具来监视写在端口上的数据包?我特别想检查用Java)编写的程序是否正常工作,因此我需要某种工具来查看我的小应用程序是否正在将消息写入端口。如何执行此操作?

45
Deepak

我发现了名为 Linux Serial SnifferjpnevulatorMoni 的项目。前两个看起来像它们确实可以满足您的要求。最后一个自称监视器,但实际上看起来像是一个标准的串行通信程序。

17
Shawn J. Goff

socat 是一种将(几乎)所有内容连接到(几乎)所有内容的工具,而 tee 可以复制流。
在您的用例中,您可以将串行端口/dev/ttyS0连接到PTY /tmp/ttyV0,然后将应用程序指向PTY,并在某处放置socat tee out输入和输出供您观察。

仔细搜索“ socat串行端口pty tee调试”将为您提供几个示例,其中一个是:

socat /dev/ttyS0,raw,echo=0 \
SYSTEM:'tee in.txt |socat - "PTY,link=/tmp/ttyV0,raw,echo=0,waitslave" |tee out.txt'

in.txtout.txt文件将包含捕获的数据。

评论者(@ogurets)确认可以正常工作。

31
Alex Stragies

我认为串行驱动程序没有任何跟踪功能可让您查看数据包。您可以使用strace观察应用程序中的所有读取和写入操作:

strace -s9999 -o myapp.strace -eread,write,ioctl ./myapp
18

这就是我最终选择的方式

多亏 吉尔斯的答案

strace -s 9999 -e read -ffp $(sed '/ttyUSB0/s/^.*proc.\([0-9]\+\).fd.*/\1/p;d' <(ls -l /proc/[1-9]*/fd/* 2>/dev/null)) 2>&1 | Perl -e '$|=1;my %qa=('a'=>7,'b'=>10,'e'=>33,'f'=>14,'n'=>12,'r'=>15,'t'=>11);sub cnv { my $ch=$_[0];$ch=$qa[$1] if $ch=~/([abefnrt])/;return chr(oct($ch));  };while (<>) { /^read.\d+,\s+"(.*)",\s\d+.*$/ && do { $_=$1;s/\\(\d+|[abefnrt])/cnv($1)/eg;print; };};'

对不起,我会解释...

#!/bin/bash

strace -s 9999 -e read -ffp $(
    sed "/tty${1:-USB0}/s/^.*proc.\([0-9]\+\).fd.*/\1/p;d" <(
        ls -l /proc/[1-9]*/fd/* 2>/dev/null
    )
) 2>&1 |
    Perl -e '
        $|=1;
        my %qa=('a'=>7,'b'=>10,'e'=>33,'f'=>14,'n'=>12,'r'=>15,'t'=>11);
        sub cnv {
            my $ch=$_[0];
            $ch=$qa[$1] if $ch=~/([abefnrt])/;
            return chr(oct($ch));
        };
        while (<>) {
            /^read.\d+,\s+"(.*)",\s\d+.*$/ && do {
                $_=$1;
                s/\\(\d+|[abefnrt])/cnv($1)/eg;
                print;
            };
        };
    '
  • 我使用ls -l /proc/[0-9]*/fd/* | grep ttyUSB0而不是lsof ttyUSB0,因为我有时看到它们很慢。
  • 因此strace将使用ttyUSB0跟踪当前程序
  • 语法:tty${1:-USB0}将用作脚本或函数,以串行设备名称作为参数运行它们:ttySniff USB0ttySniff S0,依此类推。
  • Perl脚本将unbackslashstrace -s 9999记录的字符串。
  • 您可以根据需要用strace -e readstrace -e read,write替换strace -e write

注:我使用语法来运行它们:

 script -t ttySniff.log 2>ttySniff.tm -c "./ttySniff.sh USB0"

这样我就可以重播整个操作并跟踪计时执行情况。

5
F. Hauri

interceptty 可以完成这项工作:

interceptty /dev/ttyACM0 /dev/ttyDUMMY

或者,使用尼斯输出格式并配置后端设备,并使用行缓冲:

interceptty -s 'ispeed 19200 ospeed 19200' -l /dev/ttyACM0 /dev/ttyDUMMY | interceptty-nicedump

然后将您的程序连接到/dev/ttyDUMMY

5
Golar Ramblar

当我调试应用程序与串行端口的交互时,我使用 moserial

3
Renat Zaripov

尝试这个:

screen /dev/tty.usbserial-blahblah 9600

为我工作。

3
Mike

监视串行端口的工具列表中没有minicom。例如,使用它来收听arduino设备:

minicom --device /dev/ttyACM0 --baud 9600

2
B.Kocis

看看 ttyUSBSpy 。它处于alpha阶段,但是可以工作。

1
user37414
0
Antonio Petricca