web-dev-qa-db-fra.com

Comment puis-je surveiller les données sur un port série sous Linux?

Je débogue des communications avec un périphérique série et j'ai besoin de voir toutes les données circulant dans les deux sens.

Il semble que cela devrait être facile sous Linux, où le port série est représenté par un fichier. Existe-t-il un moyen de faire une sorte de "tee bidirectionnel", où je dis à mon programme de se connecter à un tuyau qui copie les données dans un fichier et les mélange également vers/depuis le périphérique de port série réel?

Je pense que je pourrais même savoir comment écrire une telle bête, mais cela semble non trivial, en particulier pour obtenir tous les ioctls passés pour la configuration du port, etc.

Quelqu'un a-t-il déjà construit une telle chose? Il semble trop utile (pour les personnes qui déboguent des pilotes de périphérique série) de ne pas exister déjà.

25
divegeek

strace est très utile pour cela. Vous avez une visualisation de tous les appels ioctl, avec la structure correspondante décodée. Les options suivantes semblent particulièrement utiles dans votre cas:

-e read = set

Effectuez un hexadécimal complet et un vidage ASCII de toutes les données lues à partir des descripteurs de fichiers répertoriés dans l'ensemble spécifié. Par exemple, pour voir toutes les activités d'entrée sur les descripteurs de fichiers 3 et 5, utilisez -e read = 3 , 5. Notez que ceci est indépendant du suivi normal de l'appel système read (2) qui est contrôlé par l'option -e trace = read.

-e write = set

Effectuez un hexadécimal complet et un vidage ASCII de toutes les données écrites dans les descripteurs de fichiers répertoriés dans l'ensemble spécifié. Par exemple, pour voir toutes les activités de sortie sur les descripteurs de fichiers 3 et 5, utilisez -e write = 3 , 5. Notez que ceci est indépendant du suivi normal de l'appel système write (2) qui est contrôlé par l'option -e trace = write.

21
shodanex

J'ai trouvé pyserial pour être tout à fait utilisable, donc si vous êtes dans Python il ne devrait pas être trop difficile d'écrire une telle chose.

4
balpha

Une méthode simple serait d'écrire une application qui a ouvert le côté maître d'un pty et le tty sous test. Vous passeriez ensuite votre application tty du côté esclave du pty en tant que "périphérique tty".

Vous devez surveiller les attributs pty avec tcgetattr() sur le maître pty et appeler tcsetattr() sur le vrai tty, si le les attributs ont changé.

Le reste serait un simple select() sur les deux données copiées bidirectionnellement et les copiant dans un journal.

2
codeDr

J'ai regardé beaucoup de renifleurs en série. Tous sont basés sur l'idée de créer un port série virtuel et de renifler des données à partir de ce port. Cependant, tout changement en baud/parité/débit interrompra la connexion.

J'ai donc écrit mon propre renifleur :). La plupart des ports série sont désormais uniquement des convertisseurs USB-série. Mon renifleur collecte des données de l'USB via des débogages, les analyse et les envoie à la console. Tous les changements de débit en bauds, le contrôle de flux, les événements de ligne et les erreurs série sont également enregistrés. Le projet est à un stade précoce de développement et pour l'instant, seul FTDI est pris en charge.

http://code.google.com/p/uscmon/

1
MBR