Créer des ports série virtuels sous Linux

Aujourd’hui petit tutoriel pour ceux qui comme moi cherchent à émuler des ports série (également appelés ports RS-232) sous Linux. Nous verrons, au travers de ce tutoriel, comment compiler et charger le module tty0tty, qui va se charger de créer quatre paires de ports RS-232 (allant de tnt0 à tnt7), communiquant deux à deux. Ainsi, tnt0 et tnt1 agiront comme s’ils étaient reliés à un même câble physique : tout caractère transmis à l’un sera reçu par l’autre, et inversement. Même principe pour tnt2 et tnt3, tnt4 et tnt5, et enfin tnt6 et tnt7. Let’s go!

Installation du module tty0tty

Note : les commandes suivantes devront être exécutées en tant que root. Un petit sudo -i fera l’affaire.

Nous allons commencer par cloner le dépôt contenant les sources dans un répertoire, ici /opt :

cd /opt
git clone https://github.com/freemed/tty0tty

Une fois le dépôt cloné, nous allons pouvoir passer à la compilation :

cd tty0tty/module
make

Si la compilation s’est déroulée sans erreurs, nous allons pouvoir passer à la prochaine étape : l’installation dans le noyau. À noter que cette étape sera à réaliser après chaque mise à jour du noyau.

cp /opt/tty0tty/module/tty0tty.ko /lib/modules/$(uname -r)/kernel/drivers/misc

Il ne nous reste plus qu’à charger le module dans le noyau. Pour cela, nous allons re-générer les « maps » de dépendances (man depmod pour plus d’informations) puis charger le module dans le noyau :

depmod
modprobe tty0tty

Enfin, nous pouvons, si vous le souhaitez, automatiser le chargement du module à chaque démarrage du noyau. Pour cela, il suffit d’éditer (toujours avec les droits root) le fichier /etc/modules

nano /etc/modules

Puis d’y rajouter la ligne suivante, tout à la fin :

tty0tty

Vérifions que tout fonctionne correctement

Pour tester le bon fonctionnement de nos ports série, rien de plus simple. Ouvrez deux terminaux. Dans le premier, nous écouterons sur /dev/tnt0 :

sudo cat /dev/tnt0

Dans le second, nous enverrons un message à /dev/tnt1. Les deux ports agissant comme s’ils étaient physiquement reliés, /dev/tnt0 devrait ainsi pouvoir le recevoir.

sudo echo "Bonjour le monde !" > /dev/tnt1

Si tout s’est bien passé, vous devriez avoir quelque chose comme ceci :

Et voilà. Enjoy !