it-swarm-eu.dev

Jak mohu sledovat provoz sériového portu?

Existuje nějaký nástroj pro monitorování portu, který by sledoval pakety napsané na portu? Zejména chci zkontrolovat, zda můj program napsaný v Java funguje, takže potřebuji nějaký nástroj, abych zjistil, jestli moje malá aplikace zapisuje zprávy do portu. Jak to mám udělat?

45
Deepak

Našel jsem projekty s názvem Linux Serial Sniffer , jpnevulator a Moni . První dva vypadají, že dělají přesně to, co chcete. Poslední z nich se nazývá monitor, ale ve skutečnosti to vypadá jako standardní program sériové komunikace.

17
Shawn J. Goff

socat je nástroj pro propojení (téměř) všeho (téměř) všeho a tee může duplikovat proudy.
Ve svém případě můžete připojit sériový port /dev/ttyS0 do PTY /tmp/ttyV0, potom nasměrujte svou aplikaci na PTY a nechte někam vstup a výstup Socat tee out, abyste je mohli sledovat.

Googling „ladění sériového portu socat pty tee“ vám ukáže několik příkladů, z nichž jeden je:

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

Soubory in.txt a out.txt bude potom obsahovat zachycená data.

Potvrzuje to práce komentátorů (@ogurets).

31
Alex Stragies

Nemyslím si, že sériový ovladač má funkci trasování, která vám umožní sledovat pakety. Pomocí strace můžete sledovat všechna čtení a zápisy z aplikace:

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

To je způsob, jak jsem si nakonec vybral

Díky Gillesova odpověď !

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; };};'

Promiň, vysvětlím ...

#!/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;
            };
        };
    '
  • Používám ls -l /proc/[0-9]*/fd/* | grep ttyUSB0 namísto lsof ttyUSB0 protože jsem je viděl někdy pomalu.
  • Strace bude sledovat aktuální program pomocí ttyUSB0
  • Syntaxe: tty${1:-USB0} povolí, použít jako skript nebo funkci, k jejich spuštění s argumentem sériového zařízení: ttySniff USB0 nebo ttySniff S0 a tak dále.
  • Skript Perl bude unbackslash řetězce zaznamenané uživatelem strace -s 9999.
  • Mohli byste nahradit strace -e read od strace -e read,write nebo strace -e write podle vaší potřeby.

Poznámka: Spustím je pomocí syntaxe:

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

takže jsem mohl přehrát celou operaci a sledovat provádění časování.

5
F. Hauri

interceptty provádí tuto práci:

interceptty /dev/ttyACM0 /dev/ttyDUMMY

nebo, s výstupním formátem Nice as konfigurací koncového zařízení as vyrovnáváním řádků:

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

a poté se spojte s programem s programem /dev/ttyDUMMY.

5
Golar Ramblar

Když ladím interakci své aplikace se sériovým portem, používám moserial .

3
Renat Zaripov

Zkuste to:

screen /dev/tty.usbserial-blahblah 9600

pracuje pro mě.

3
Mike

minicom chybí v seznamu nástrojů pro monitorování sériových portů. Použijte jej například k poslechu zařízení arduino:

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

2
B.Kocis

Podívejte se na ttyUSBSpy . Je na alfa scéně, ale funguje.

1
user37414
0
Antonio Petricca