Les ports série étaient partout. D’une certaine manière, ils le sont encore, car de nombreux éléments qui semblent se brancher en tant que périphérique USB ressemblent en fait à un port série. Le problème est qu’aujourd’hui, le monde fonctionne sur le réseau. Bien sûr, vous pouvez acheter un serveur de terminaux qui convertit un port série en port Ethernet, mais qu’est-ce que c’est amusant? Dans cet article, je vais vous montrer comment diffuser des ports série sur le réseau à l’aide de certains outils Linux disponibles. Ce n’est pas parfait et cela ne fonctionnera pas pour tous les cas, mais quand cela fonctionne, cela fonctionne bien.

Tout est un fichier, jusqu’à ce que ce ne soit pas

À un certain moment dans le passé, Unix – le progéniteur de Linux – traitait pratiquement tout comme un fichier, et tous les fichiers étaient créés plus ou moins égaux. Les programmes ne se soucient pas de savoir si un fichier est local, sur le réseau, à partir d’un lecteur de bande ou arrivant via un canal nommé.

Mais les choses ont commencé à changer. Même si un port série n’est qu’un fichier sous Linux, il possède des attributs spéciaux qui vous permettent de définir, par exemple, les vitesses de transmission. Pire encore, certains programmes «en savent» trop sur les fichiers et insistent sur certaines conventions de dénomination. Donc, en théorie, vous devriez être en mesure de créer une prise réseau, de connecter une extrémité à un port série et l’autre à un programme, et en avoir terminé. En théorie.

La pratique est différente, bien sûr. Cela pourrait fonctionner dans certains cas très simples. Vous pouvez utiliser un utilitaire appelé socat (comme chat pour une prise) pour le configurer. Cependant, si le programme que vous essayez de simuler essaie de définir un débit en bauds, par exemple, il va probablement baisser les bras. Certains programmes ne reconnaissent même pas votre faux port série.

À propos de Socat

La socat Le programme est comme un câble adaptateur magique qui conduit simplement tout d’un endroit à un autre et gère également le trafic inverse. Le programme peut lire des fichiers, des tubes, des périphériques, des sockets et quelques autres éléments. Par exemple, vous souhaiterez peut-être créer un proxy TCP simple pour transférer les connexions de l’hôte local vers un autre hôte. C’est facile avec socat:

socat TCP4-LISTEN:88 TCP4:10.1.1.125:8000

Cela ne gérera qu’une seule connexion, mais vous pouvez même demander socat pour créer une nouvelle connexion pour gérer plusieurs requêtes.

Le problème

Si vous essayez de le faire avec un port série, cependant, il est peu probable que cela fonctionne sans beaucoup de configuration. C’est un désir si commun qu’il existe plusieurs programmes disponibles pour vous aider. La plupart des distributions Linux prendront en charge ser2net, un programme conçu pour gérer la tâche de conversion d’un port série en socket. Si ser2net ne vous convient pas, il y a aussi du code Python qui est livré comme exemple avec le pyserial bibliothèque, mais votre version de distribution de pyserial peut-être trop vieux pour le supporter. Si tel est le cas, vous devrez l’installer en dehors de votre gestionnaire de packages en utilisant pip, par exemple. Je vais supposer que vous utilisez ser2net.

La ser2net le programme s’installe normalement en tant que service système et vous pouvez modifier /etc/ser2net.conf pour le configurer. J’ai retiré toutes les lignes par défaut et ajouté les deux ports série que je voulais exposer avec les débits en bauds que je voulais:

7777:telnet:0:/dev/ttyUSB0:115200 8DATABITS NONE 1STOPBIT remctl
7778:telnet:0:/dev/ttyUSB1:115200 8DATABITS NONE 1STOPBIT remctl

Ensuite, vous devrez redémarrer le service (probablement systemctl restart ser2net; s’il ne parvient pas à redémarrer la première fois, essayez à nouveau car parfois il essaie de démarrer avant que l’ancienne copie ne soit totalement arrêtée).

Pour le débogage, vous souhaiterez peut-être arrêter le service et l’exécuter avec certains messages de débogage:

ser2net -d -C "7778:telnet:0:/dev/ttyUSB1:115200 8DATABITS NONE 1STOPBIT remctl"

Quoi qu’il en soit, une fois le service en cours d’exécution, les ports que vous spécifiez (7777 et 7778 dans mon fichier de configuration) agiront comme les ports série associés.

Quelques notes. Si vous faites cela avec une imprimante 3D et que quelque chose comme Octoprint est en cours d’exécution, vous devrez l’éteindre ou le faire relâcher le port de l’imprimante avant de configurer tout cela. Ce serait le cas de tout programme qui contiendrait le port série que vous souhaitez ouvrir. Pour certains ports standard, vous devez vous assurer que la connexion ne maintient pas le port ouvert et n’attend pas un utilisateur. Le fonctionnement exact de tout cela dépendra de votre configuration. Il en va de même pour votre pare-feu. Si vous écoutez sur le port 7777 et que vous utilisez un pare-feu, vous devrez le configurer pour autoriser les connexions sur ce port. N’oubliez pas que vous devez généralement être root pour ouvrir des ports à faible numéro.

Le côté client

Côté client, vous pouvez utiliser socat, mais certains programmes comprendront que ce n’est pas un vrai port série. Vous pouvez toujours essayer:

socat pty,link=$HOME/dev/ttyNET0,waitslave tcp:10.1.1.125:7777

Certains programmes ne rechercheront que des appareils dans /dev, bien que. Si c’est le cas pour vous, vous allez devoir courir socat en tant que root (utilisez sudo) puis définissez également /dev/ttyNET0 afin que vous ayez des autorisations de lecture et d’écriture (par exemple, sudo chmod 666 /dev/ttyNET0).

Test 1, 2, 3…

Au lieu d’essayer votre programme tout de suite, je vous suggère de tester en utilisant quelque chose comme picocom. Par exemple, sur l’ordinateur client après avoir exécuté socat, vous devriez pouvoir exécuter quelque chose comme:

picocom -b 115200 $HOME/dev/ttyNET0
Picocom peut parler sur le réseau à l’aide d’un périphérique série virtuel

De toute évidence, vous devrez utiliser le bon nom et la bonne vitesse de transmission. Vous devriez pouvoir parler à l’appareil distant. Sinon, déterminez pourquoi avant d’exécuter le programme régulier. Si votre périphérique série n’est pas basé sur du texte, vous aurez peut-être plus de chance avec cutecom mais, hélas, le programme sait que votre faux port série est faux et ne vous laissera pas le sélectionner. D’autre part, le programme est open source, vous pouvez donc facilement créer une version locale qui utilise n’importe quel nom de périphérique que vous aimez. Il y a bien sûr d’autres choix. Par exemple, gtkterm vous permettra de récupérer le faux port série.

Si vous rencontrez une erreur de protocole, vous constaterez peut-être que le port série a bougé (par exemple, il /dev/ttyUSB0 et maintenant c’est /dev/ttyUSB1) ou vous avez un débit en bauds non valide. Le message d’erreur n’est pas très utile, mais n’oubliez pas d’utiliser l’option -d dans ser2net lors du dépannage.

La ttynvt Le programme n’a pas d’excellents graphiques de documentation, mais ils sont précis.

Lorsque vous exécutez le programme régulier, cela peut fonctionner. Cependant, cela peut également générer une erreur ou, dans certains cas, refuser de vous laisser sélectionner le fichier car ce n’est pas vraiment un port série. Dans certains cas, vous n’avez tout simplement pas de chance. Cependant, un client plus intelligent qui comprend le port série peut également aider. La ttynvt programme en est un exemple. Vous devrez probablement le construire à partir des sources, mais c’est très facile à faire. cela dépend de libfuse, mais autrement n’a besoin de rien d’exotique.

Une fois que vous l’avez construit, essayez quelque chose comme ceci:

sudo src/ttynvt -M 199 -m 6 -n ttyNET0 -S 10.1.1.125:7777

Cela créera le /dev/ttyNET0 périphérique (vous devez donc être root). Sur mon système, le nouveau périphérique avait des autorisations de lecture et d’écriture définies pour la racine et le groupe de numérotation. Vous devrez peut-être vérifier et corriger les autorisations, cependant, en fonction de votre configuration.

Encore une fois, testez avec picocom, puis essayez votre programme cible. Croiser les doigts!

Pourquoi oh pourquoi?

Mon objectif initial était d’exécuter le logiciel Lightburn pour ma découpeuse laser sur une grosse machine à l’aide d’un bureau à distance. Je voulais que le découpeur laser soit branché sur le port USB de la machine locale et que le logiciel communique avec un faux port sur le plus gros ordinateur.

Hélas, à partir d’aujourd’hui, Lighburn est trop intelligent pour mes astuces coquines et refuse de montrer mes ports série virtuels. Il n’y a aucun moyen à ma connaissance de le forcer à utiliser un nom de fichier de mon choix, donc je ne peux même pas essayer de voir si cela fonctionnerait. Cependant, j’ai pu tester la configuration avec un autre logiciel de code G et cela fonctionne. J’ai mentionné cela à Lightburn, alors peut-être que cela sera corrigé au moment où vous lirez ceci.

Le paradigme selon lequel «tout est un fichier» est très puissant. Malheureusement, chaque année, cela devient moins vrai et cela fait sauter plus de cerceaux lorsque vous voulez faire quelque chose d’intéressant comme celui-ci. Pourtant, dans la vraie mode Linux, il y a toujours un moyen d’y arriver. Je n’ai aucun doute que je pourrais retracer les appels que Lighburn effectue pour ouvrir le port et trouver un moyen de les simuler pour le client série. J’espère cependant que je n’ai pas à le faire.

LAISSER UN COMMENTAIRE

Rédigez votre commentaire !
Entrez votre nom ici