web-dev-qa-db-fra.com

Comment puis-je surveiller le trafic du port série?

Existe-t-il un outil de surveillance de port pour regarder les paquets écrits sur le port? Je veux surtout vérifier si mon programme écrit en Java fonctionne donc j'ai besoin d'une sorte d'outil pour voir si ma petite application écrit les messages sur le port. Comment faire?

45
Deepak

J'ai trouvé des projets appelés Linux Serial Sniffer , jpnevulator , et Moni . Les deux premiers semblent faire exactement ce que vous voulez. Le dernier s'appelle un moniteur, mais il ressemble en fait à un programme de communication série standard.

17
Shawn J. Goff

socat est un outil pour connecter (presque) tout à (presque) tout, et tee peut dupliquer des flux.
Dans votre cas d'utilisation, vous pouvez connecter votre port série /dev/ttyS0 vers un PTY /tmp/ttyV0, puis pointez votre application vers le PTY, et demandez à socat tee de sortir les entrées et sorties quelque part pour que vous puissiez les observer.

La recherche sur "débogage du tee pty du port série socat" vous indiquera plusieurs exemples, dont un:

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

Les fichiers in.txt et out.txt contiendra alors les données capturées.

Cela a été confirmé par les commentateurs (@ogurets).

31
Alex Stragies

Je ne pense pas que le pilote série ait une fonctionnalité de traçage qui vous permettrait de regarder des paquets. Vous pouvez utiliser strace pour observer toutes les lectures et écritures de votre application:

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

C'est comme ça que j'ai finalement choisi

Merci à réponse de 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; };};'

Désolé, je vais vous expliquer ...

#!/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;
            };
        };
    '
  • J'utilise ls -l /proc/[0-9]*/fd/* | grep ttyUSB0 au lieu de lsof ttyUSB0 parce que je les ai vues parfois lentes.
  • Donc strace tracera le programme en cours en utilisant ttyUSB0
  • Syntaxe: tty${1:-USB0} permettra, utilisé comme script ou fonction, de les exécuter avec le nom du périphérique série comme argument: ttySniff USB0 ou ttySniff S0 etc.
  • Le script Perl unbackslash chaînes enregistrées par strace -s 9999.
  • Vous pouvez remplacer strace -e read par strace -e read,write ou strace -e write selon vos besoins.

Remarque: Je les exécute en utilisant la syntaxe:

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

afin que je puisse rejouer toute l'opération et suivre les exécutions de synchronisation.

5
F. Hauri

interceptty fait ce travail:

interceptty /dev/ttyACM0 /dev/ttyDUMMY

ou, avec un format de sortie Nice et avec la configuration du périphérique backend, et avec la mise en mémoire tampon de ligne:

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

puis connectez-vous avec votre programme à /dev/ttyDUMMY.

5
Golar Ramblar

Lorsque je débogue l'interaction de mon application avec un port série, j'utilise moserial .

3
Renat Zaripov

Essaye ça:

screen /dev/tty.usbserial-blahblah 9600

travaille pour moi.

3
Mike

minicom est absent de la liste des outils pour surveiller les ports série. Utilisez-le comme par exemple pour écouter un périphérique Arduino:

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

2
B.Kocis

Jetez un oeil à ttyUSBSpy . C'est sur la scène alpha, mais ça marche.

1
user37414
0
Antonio Petricca