177 votes

Port série virtuel pour Linux

J'ai besoin de tester une application de port série sous Linux, cependant, ma machine de test ne possède qu'un seul port série.

Existe-t-il un moyen d'ajouter un port série virtuel à Linux et de tester mon application en émulant un périphérique via un shell ou un script ?

Note : Je ne peux pas remapper le port, il est codé en dur sur ttys2 et je dois tester l'application telle qu'elle est écrite.

221voto

cantoni Points 368

Complétant la réponse de @slonik.

Vous pouvez tester socat pour créer un port série virtuel en suivant la procédure suivante (testé sur Ubuntu 12.04) :

Ouvrez un terminal (appelons-le Terminal 0) et exécutez-le :

socat -d -d pty,raw,echo=0 pty,raw,echo=0

Le code ci-dessus renvoie :

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/2
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/3
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs [3,3] and [5,5]

Ouvrez un autre terminal et écrivez (Terminal 1) :

cat < /dev/pts/2

le nom du port de cette commande peut être modifié en fonction du pc. il dépend de la sortie précédente.

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**2**
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**3**
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs 

vous devez utiliser le numéro disponible sur la zone mise en évidence.

Ouvrez un autre terminal et écrivez (Terminal 2) :

echo "Test" > /dev/pts/3

Revenez maintenant au terminal 1 et vous verrez la chaîne "Test".

0 votes

Cela a mieux fonctionné pour moi que la réponse de Slonik, parce qu'il attribue automatiquement les fichiers de port COM virtuel et ne fait pas d'écho.

13 votes

Si vous voulez un nom de fichier reproductible, utilisez link=/path/to/link après chaque déclaration de périphérique (après echo=0). Il peut donc être utilisé dans des tests automatisés. (comme le fait slonik dans sa réponse)

0 votes

Cela a fonctionné exactement comme indiqué. Cela m'a aidé, merci.

85voto

apenwarr Points 4956

Vous pouvez utiliser un pty ("pseudo-télétype", alors qu'un port série est un "vrai télétype") pour cela. D'une extrémité, ouvrez /dev/ptyp5 puis attachez votre programme à /dev/ttyp5 ; ttyp5 agira exactement comme un port série, mais enverra/recevra tout ce qu'il fait via /dev/ptyp5.

Si vous avez vraiment besoin qu'il parle à un fichier appelé /dev/ttys2 alors il suffit de déplacer votre ancienne /dev/ttys2 et faire un lien symbolique à partir de ptyp5 à ttys2 .

Bien sûr, vous pouvez utiliser un autre nombre que ptyp5 . Choisissez-en une avec un nombre élevé pour éviter les doublons, puisque tous vos terminaux de connexion utiliseront également des ptys.

Wikipedia en dit plus sur les ptys : http://en.wikipedia.org/wiki/Pseudo_terminal

10 votes

Sous linux, vous pouvez utiliser les appels système openpty / forkpty. Voir page de manuel

12 votes

Comment créer une paire de ports série virtuels en utilisant un outil de ligne de commande ?

0 votes

Utiliser chroot pour falsifier les noms de périphériques sans affecter le système

60voto

slonik Points 238

Utilisez socat pour cela :

Par exemple :

socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11

0 votes

Cela a bien fonctionné pour moi, testé avec minicom ! Il semble que l'entrée sur un terminal soit répercutée sur les deux (elle réapparaîtra donc aussi sur le terminal d'entrée).

1 votes

Je n'ai pas le même comportement d'écho ... minicom a une fonction "écho local" ... mais quand elle est désactivée, il fonctionne exactement comme un vrai port série. merci pour le conseil.

21voto

Peter Remmers Points 423

Il y a aussi tty0tty http://sourceforge.net/projects/tty0tty/ qui est un véritable émulateur de null modem pour linux.

Il s'agit d'un simple module de noyau - un petit fichier source. Je ne sais pas pourquoi il n'a reçu que des pouces en bas sur sourceforge, mais il fonctionne bien pour moi. La meilleure chose à son sujet est qu'il émule également les broches matérielles (RTC/CTS DSR/DTR). Il implémente même les commandes iotcl TIOCMGET/TIOCMSET et TIOCMIWAIT !

Sur un noyau récent, vous pouvez obtenir des erreurs de compilation. Ceci est facile à corriger. Insérez simplement quelques lignes en haut du source module/tty0tty.c (après les includes) :

#ifndef init_MUTEX
#define init_MUTEX(x) sema_init((x),1)
#endif

Lorsque le module est chargé, il crée 4 paires de ports série. Les périphériques sont /dev/tnt0 à /dev/tnt7 où tnt0 est connecté à tnt1, tnt2 est connecté à tnt3, etc. Il se peut que vous deviez corriger les permissions des fichiers pour pouvoir utiliser les périphériques.

éditer :

Je suppose que j'ai été un peu rapide avec mon enthousiasme. Bien que le pilote semble prometteur, il semble instable. Je n'en suis pas sûr, mais je pense qu'il a fait tomber en panne une machine du bureau sur laquelle je travaillais depuis chez moi. Je ne peux pas vérifier tant que je ne suis pas de retour au bureau lundi.

La deuxième chose est que TIOCMIWAIT ne fonctionne pas. Le code semble avoir été copié à partir d'un code d'exemple "tiny tty". La gestion de TIOCMIWAIT semble en place, mais il ne se réveille jamais parce que l'appel correspondant à wake_up_interruptible() est manquant.

éditer :

L'accident dans le bureau était vraiment la faute du conducteur. Il manquait une initialisation, et le code TIOCMIWAIT, complètement non testé, a provoqué un crash de la machine.

J'ai passé hier et aujourd'hui à réécrire le pilote. Il y avait beaucoup de problèmes, mais maintenant il fonctionne bien pour moi. Il manque encore du code pour le contrôle de flux matériel géré par le pilote, mais je n'en ai pas besoin car je gérerai moi-même les broches en utilisant TIOCMGET/TIOCMSET/TIOCMIWAIT depuis le code en mode utilisateur.

Si quelqu'un est intéressé par ma version du code, envoyez-moi un message et je vous l'enverrai.

3 votes

Je serais intéressé de voir votre code. Pouvez-vous le réinjecter dans le projet tty0tty ? Cependant, je préférerais voir les gens améliorer le code du pseudo-terminal dans le noyau Linux. Par exemple, ajouter le support du handshaking matériel et TIOCMIWAIT.

3 votes

"Si quelqu'un est intéressé par ma version du code, envoyez-moi un message et je vous l'enverrai." Oui, je suis intéressé ! Pouvez-vous la pointer quelque part, par exemple sur GitHub ?

9 votes

J'ai téléchargé le pilote sur : github.com/pitti98/nullmodem Désolé d'avoir mis si longtemps à répondre. Je ne suis pas très actif sur stackoverflow et j'ai négligé votre commentaire !

9voto

Vous pouvez consulter Tibbo VSPDL pour la création d'un port série virtuel sous Linux à l'aide d'un pilote Kernel - il semble assez récent et est disponible au téléchargement dès maintenant (version bêta). Je ne suis pas sûr de la licence à ce stade, ou s'ils veulent le rendre disponible commercialement seulement à l'avenir.

Il existe d'autres alternatives commerciales, telles que http://www.ttyredirector.com/ .

Dans Open Source, Remerial (GPL) peut également faire ce que vous voulez, en utilisant les PTY d'Unix. Il transmet les données série sous "forme brute" à un socket réseau ; la configuration des paramètres du terminal, à la manière de STTY, doit être faite lors de la création du port, les modifier plus tard comme décrit dans la RFC 2217 ne semble pas être supporté. Vous devriez être capable d'exécuter deux instances de remserial pour créer un nullmodem virtuel comme com0com, sauf que vous devrez configurer la vitesse du port etc. à l'avance.

Socat (également GPL) est comme une variante étendue de Remserial avec beaucoup plus d'options, y compris une méthode "PTY" pour rediriger le PTY vers autre chose, qui peut être une autre instance de Socat. Pour Unit tets, socat est probablement plus agréable que remserial car vous pouvez directement catcher des fichiers dans le PTY. Voir le Exemple de PTY sur la page de manuel. A le patch existe sous "contrib" pour fournir le support RFC2217 pour la négociation des paramètres de la ligne série.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X