Looking for Computer Science  & Information Technology online courses ?
Check my new web site: https://www.yesik.it !

Inutile de vous faire un laïus sur les ports RS-232 qui disparaissent des PC modernes: si vous avez tenté de connecter un périphérique muni de cette interface sur un ordinateur récent, vous l'avez constaté par vous même! Ainsi, afin de pouvoir me connecter au port console d'un switch, j'ai dû récemment m'acheter un adaptateur USB/RS-232 TRENDnet TU-S9 [ Voir sur Amazon.fr].

USB A.png

Le connecteur USB type A. Celui-ci est destiné à être utilisé sur le périphérique USB qui fournit l'alimentation électrique (généralement, un ordinateur).


DE9.png

Le connecteur DE9. Ce connecteur est bien connu pour être le connecteur habituel pour le port série RS-232, bien que ce ne soit pas imposé par la norme. Il est souvent appelé à tord DB9 par analogie avec le port DB25 également utilisé sur les ordinateurs lors de son apparition. Mais, si tous deux appartiennent à la famille D des connecteurs ITT Cannon, en réalité, la seconde lettre du nom sert à indiquer la largeur du connecteur.


Comme tous les adaptateurs de ce genre, celui-ci se présente sous la forme d'un câble doté d'une prise USB A mâle d'un côté et d'une prise DE9 mâle de l'autre. Mais en réalité, c'est bien plus qu'un câble: en effet, celui-ci inclus, caché dans le corps d'une des deux prises, un circuit électronique spécialisé chargé de faire la conversion. Sur le câble que j'ai acheté, comme sur la majorité des câbles de cette gamme de prix, le circuit en question est le PL-2303 de Prolific. Pourquoi rentrer dans de tels détails? Parce que, contrairement à ce qui se passe sous Windows, vous n'aurez pas besoin d'installer un driver spécifique et propriétaire (et bogué?) pour utiliser ce genre d'adaptateur: en effet, le noyau Linux intègre en standard un driver pour le PL-2303. Autant dire qu'avec n'importe quel système Linux raisonnablement récent (kernel 2.4 ou mieux, 2.6) il devrait marcher out-of-the-box.

Pour les électroniciens

Les adaptateurs basés sur le PL-2303 fournissent une tension de 12V compatible avec les ports RS-232 classiques trouvés sur les PC et les périphériques.

Par contre, si vous devez vous connecter à une carte électronique communiquant par liaison série TTL (5V ou 3,3V), il faudra vous diriger vers un adaptateur spécifique basé sur le circuit FTDI. On peut se procurer ce genre de câble via des circuits de distribution spécialisés comme chez AdaFruit.

Mis à part ces détails techniques, tout ce qui suit reste valide aussi pour ces adaptateurs, car ici encore, le driver adéquat (ftdi_sio) sera inclus dans n'importe quelle version récente de Linux, et le câble devrait être détecté automatiquement et sans problème.

Connexion

Le raccordement physique de l'adaptateur n'a rien de compliqué. Pour vous assurer que votre système Linux possède bien le driver nécessaire, plusieurs possibilités s'offrent à vous. La plus simple (mais pas forcément la plus élégante) est de comparer l'état de votre système avant et après connexion de l'adaptateur sur le port USB. L'avantage de cette solution est de pouvoir être mise en œuvre même sans accès root à la machine. En général, examiner la liste des périphériques et les modules chargés est suffisant:

sh$ find /dev > dev-before
sh$ lsmod > mod-before

Maintenant raccordez l'adaptateur à votre PC par le port USB, et refaites la manœuvre (en changeant les noms de fichiers):

sh$ find /dev > dev-after
sh$ lsmod > mod-after

Reste à comparer:

sh$ diff mod-{before,after}
1a2,3
> pl2303                 13880  0 
> usbserial              27676  1 pl2303
97c99
< usbcore               122386  4 usbhid,uvcvideo,ehci_hcd
---
> usbcore               122386  6 pl2303,usbserial,usbhid,uvcvideo,ehci_hcd

Comme vous le voyez, sur mon système la connexion de l'adaptateur a entrainé le chargement des modules pl2303 (le driver pour le circuit électronique embarqué dans l'adaptateur) et usbserial (le module chargé d'associer un tty au périphérique USB).

Vous savez aussi que pour communiquer avec un périphérique, les systèmes Unix utilisent un fichier spécial dans le dossier /dev. Sur un système Linux équipé de udev pour gérer les périphériques hot-plug, l'ajout et la suppression d'entrées dans /dev se fait automatiquement à la connexion/déconnexion des périphériques. Voyons si ça a été le cas:

sh$ diff dev-{before,after}
1a2,7
> /dev/serial
> /dev/serial/by-id 
> /dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller_D-if00-port0
> /dev/serial/by-path
> /dev/serial/by-path/pci-0000:00:1d.0-usb-0:1.2:1.0-port0
> /dev/ttyUSB0
700a713
> /dev/bus/usb/002/011
708a722,723
> /dev/char/188:0
> /dev/char/189:138

Vous serez peut-être surpris de découvrir l'ajout de plusieurs périphériques nouveaux. C'est parce que les noyaux Linux modernes permettent d'accéder à un même périphérique par différents chemins à partir de /dev. Mais en réalité, hormis celui-ci, ce sont tous des liens symboliques vers /dev/ttyUSB0.

Si vous avez un accès root sur votre système, vous pouvez aussi vous assurer que l'adaptateur est reconnu en lançant l'examen de /var/log/syslog juste avant de brancher votre adaptateur:

sh# tail -f /var/log/syslog
# ...
# Brancher l'adaptateur USB/RS-232
# ...
May  5 12:25:51 daal kernel: [189871.869734] usb 2-1.2.3: new full speed USB device using ehci_hcd and address 17
May  5 12:25:51 daal kernel: [189871.962986] usb 2-1.2.3: New USB device found, idVendor=067b, idProduct=2303
May  5 12:25:51 daal kernel: [189871.962992] usb 2-1.2.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
May  5 12:25:51 daal kernel: [189871.962996] usb 2-1.2.3: Product: USB-Serial Controller D
May  5 12:25:51 daal kernel: [189871.962999] usb 2-1.2.3: Manufacturer: Prolific Technology Inc. 
May  5 12:25:51 daal kernel: [189871.963112] usb 2-1.2.3: configuration #1 chosen from 1 choice
May  5 12:25:51 daal kernel: [189871.964016] pl2303 2-1.2.3:1.0: pl2303 converter detected
May  5 12:25:51 daal kernel: [189871.965760] usb 2-1.2.3: pl2303 converter now attached to ttyUSB0

Comme vous le voyez, les informations présentées ici confirment bien tout ce que je disais précédemment: bien que la marque commerciale sur l'adaptateur soit sans rapport, en réalité c'est bien un circuit Prolific pl2303. Si vous avez autre-chose, c'est que le circuit de votre adaptateur utilise un autre circuit (comme FTDI). Mais, à moins que ce ne soit un circuit exotique, le driver a aussi des chances d'être disponible en standard.

Accessoirement, il est aussi possible d'obtenir des informations sur le périphérique USB nouvellement connecté en examinant /proc/bus/usb/devices:

sh$ cat /proc/bus/usb/devices
# ...
T:  Bus=02 Lev=03 Prnt=19 Port=02 Cnt=02 Dev#= 21 Spd=12   MxCh= 0
D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=067b ProdID=2303 Rev= 4.00
S:  Manufacturer=Prolific Technology Inc.
S:  Product=USB-Serial Controller D
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA
I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=pl2303
E:  Ad=81(I) Atr=03(Int.) MxPS=  10 Ivl=1ms
E:  Ad=02(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
E:  Ad=83(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
# ...

USB-Serial Controller D – PL-2303 Rev 4

Accessoirement, le contenu de /proc/bus/usb/devices m'apporte une information qui m'avait échappée jusqu'à présent: il semblerait que le circuit embarqué dans cet adaptateur soit un PL-2303 révision D (Rev=4.00 et USB-Serial Controller D). Ça n'a pas grande importance ici, mais d'après les spécifications du constructeur, ça me laisse supposer une compatibilité RS422/RS485.

Utilisation

À ce stade, si j'ai pu satisfaire ma légitime curiosité quand au matériel acheté, j'ai surtout pu m'assurer qu'il était supporté par Linux sur mon ordinateur. Il est certainement temps de passer à sa mise en œuvre.

En fait, il n'y a rien de spécifique au fait que la communication passe par un adaptateur USB/RS-232. Tout se passe exactement comme s'il s'agissait d'un vrai port série RS-232. Vos utilitaires habituels vont donc fonctionner: stty, screen, etc.

Configurer le port avec stty

La commande stty va vous permettre de régler les différents paramètres de communication du port. Ce qui permettra de lire et d'écrire dessus comme sur n'importe quel périphérique caractère.

Dans mon cas, le switch avec lequel je voulais communiquer nécessite de configurer le port série à 38400 bits/seconde 8N1 (huit bits de données – pas de parité – un bit de stop) , sans contrôle de flux logiciel. Dans ce cas, pour examiner les messages de démarrage qui sont émis sur la liaison série, j'utilise les commandes suivantes juste avant d'allumer le périphérique:

sh$ stty -F /dev/ttyUSB0 38400 cs8 ixon
sh$ cat < /dev/ttyUSB0
# Mise en marche du switch
BOOT Software Version 1.0.0.3 Built  26-Dec-2006  14:33:26


Networkimg device based on 88E6218 with ARM946E-S.
64MByte SDRAM. I-Cache 8 KB. D-Cache 8 KB. Cache Enabled.

Autoboot in 2 seconds - press RETURN or Esc. to abort and enter prom.
# ...

Permission refusée

Si vous avez un message d'erreur permission refusée, c'est que vous ne disposez pas des permissions en écriture sur le périphérique /dev/ttyUSB.

Avant de vous précipiter pour passer root, vérifiez si les permissions nécessaires ne sont pas accordées aux membres d'un groupe particulier:

sh$ ls -ls /dev/ttyUSB0
0 crw-rw---- 1 root dialout 188, 0 May  6 11:04 /dev/ttyUSB0

Sur mon système Debian, les membres du groupe dialout ont les permissions en lecture/écriture sur ce périphérique. Si vous voulez y avoir accès, il vous suffit donc de faire partie de ce groupe:

sh# adduser sylvain dialout
Adding user `sylvain' to group `dialout' ...
Done.

L'ajout de l'utilisateur à son nouveau groupe sera effectif au prochain login de celui-ci.

Ici, j'ai utilisé cat et une redirection pour lire ce qui était transmis par le périphérique via sa liaison série. Il est bien sûr aussi possible d'utiliser la redirection en entrée pour écrire sur le périphérique. Voire les deux simultanément. Par contre, si vous voulez un échange bidirectionnel et interactif entre la console avec votre périphérique, il faudra utiliser un émulateur de terminal.

Émuler un terminal avec screen

La commande screen est un émulateur de terminal VT100 qui permet de communiquer de manière bidirectionnelle avec un périphérique. Malgré son apparence simple, screen est un logiciel sophistiqué avec beaucoup de possibilités. Ici, je me contenterai de l'utilisation basique:

sh$ screen /dev/ttyUSB0 38400,cs8,ixon

                          Login Screen
                          ============


                       User Name:                       

                       Password:

Configuration

Lors de l'invocation de screen il est nécessaire de redonner les paramètres de communication nécessaire (vitesse, parité, etc.), sinon elles sont ré-initialisées à leurs valeurs par défaut.

Ce sont les mêmes options que stty, mais ici séparées les unes des autres par une virgule.

Quitter screen

Je vous engage à parcourir le manuel de screen (man screen – Le manuel de screen), qui est assez impressionnant par sa longueur, pour avoir une idée des différentes possibilités de cet émulateur.

Mais, au minimum, vous allez avoir besoin de savoir comment quitter (et donc fermer la liaison série). Normalement, il faut taper Ctrl-\ (contrôle backslash). Ce qui s'avère inopérant sur un clavier français où le backslash est accessible via la touche AltGr (autrement dit, Ctrl-AltGr-backslash ne quitte pas screen).

La solution est d’utiliser la commande quit. Le mode commande est accessible via Ctrl-a suivi par : (deux-points). Ce qui nous donne pour quitter: Ctrl-a :quit. Il faut le savoir...

Une fois screen lancé tout ce qui sera tapé au clavier sera envoyé sur la liaison série. Et inversement, ce que l'ordinateur recevra de la liaison série sera affiché sur la console.

Pour terminer, il faut l'avouer, la liaison RS-232 peut être pénible à configurer. Et trouver la bonne combinaison d'options pour stty peut se révéler en entreprise assez frustrante, surtout quand on ne connait pas à priori les paramètres de communication utilisés par le périphérique.

Ainsi, des caractères étranges à l'écran peuvent laisser supposer un problème de vitesse (4800 bits/s, 9600 bits/s, etc.), de bits par caractères, de parité ou de nombre de bits de stop. À l'inverse, si les caractères s'affichent convenablement, mais que ce que vous tapez apparaît en double ou pas du tout, recherchez plutôt dans les options echo de stty. L'une d'entre-elles n'est peut-être pas convenablement configurée pour votre cas particulier. Bon courage!

Ressources