it-swarm.it

Come posso monitorare il traffico della porta seriale?

Esiste uno strumento di monitoraggio delle porte per guardare i pacchetti scritti sulla porta? In particolare, voglio verificare se il mio programma è scritto in Java funziona, quindi ho bisogno di un qualche tipo di strumento per vedere se la mia piccola applicazione sta scrivendo i messaggi sulla porta. Come posso fare?

45
Deepak

Ho trovato progetti chiamati Linux Serial Sniffer , jpnevulator e Moni . I primi due sembrano fare esattamente quello che vuoi. L'ultimo si chiama monitor, ma in realtà sembra un normale programma di comunicazione seriale.

17
Shawn J. Goff

socat è uno strumento per connettere (quasi) tutto a (quasi) tutto e tee può duplicare i flussi.
Nel tuo caso d'uso puoi connettere la tua porta seriale /dev/ttyS0 a un PTY /tmp/ttyV0, quindi punta la tua applicazione verso il PTY e disponi socat tee out Input e Output da qualche parte per farti osservare.

Googling "socat serial port pty tee debug" ti indicherà diversi esempi, uno dei quali:

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

I file in.txt e out.txt conterrà quindi i dati acquisiti.

Ciò è stato confermato dal funzionamento dei commentatori (@ogurets).

31
Alex Stragies

Non credo che il driver seriale abbia alcuna funzionalità di traccia che ti consenta di guardare i pacchetti. Puoi usare strace per osservare tutte le letture e le scritture dalla tua applicazione:

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

Questo è il modo in cui finalmente scelgo

Grazie a risposta di Gilles !

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

Scusa, ti spiego ...

#!/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;
            };
        };
    '
  • Io uso ls -l /proc/[0-9]*/fd/* | grep ttyUSB0 invece di lsof ttyUSB0 perché li ho visti un po 'lenti.
  • Quindi strace traccerà il programma corrente usando ttyUSB0
  • Sintassi: tty${1:-USB0} consentirà, utilizzato come script o funzione, di eseguirli con il nome del dispositivo seriale come argomento: ttySniff USB0 o ttySniff S0 e così via.
  • Lo script Perl sarà unbackslash stringhe registrate da strace -s 9999.
  • Puoi sostituire strace -e read di strace -e read,write o strace -e write a seconda delle tue necessità.

Nota: li eseguo usando la sintassi:

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

così ho potuto ripetere l'intera operazione e tracciare le esecuzioni temporali.

5
F. Hauri

interceptty fa quel lavoro:

interceptty /dev/ttyACM0 /dev/ttyDUMMY

oppure, con un formato di output Nice e con la configurazione del dispositivo back-end, e con buffering di linea:

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

e quindi connettiti con il tuo programma a /dev/ttyDUMMY.

5
Golar Ramblar

Quando eseguo il debug dell'interazione della mia applicazione con una porta seriale, utilizzo moserial .

3
Renat Zaripov

Prova questo:

screen /dev/tty.usbserial-blahblah 9600

per me va bene.

3
Mike

minicom non è presente nell'elenco degli strumenti per monitorare le porte seriali. Usalo come ad esempio per ascoltare il dispositivo Arduino:

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

2
B.Kocis

Dai un'occhiata a ttyUSBSpy . È in fase alfa, ma funziona.

1
user37414
0
Antonio Petricca