Articles - Fiches récapitulatives

Liaison série & adaptateurs USB (RS-232/UART)

  |   8050  |   Poster commentaire  |  Fiches récapitulatives
Page récapitulative concernant ces petites bestioles très utiles qui permettent d'envoyer et de recevoir des données facilement entre un ordinateur et un périphérique externe (minitel, switch/routeur, appareil de mesure, set-top box, etc...). On les trouve facilement sur eBay pour quelques euros. Bien que maintenant obsolète, largement ringardisé par l'USB (surtout en terme de débit), on trouve encore ce protocole dans certains équipements.

adapters


La liaison série


La transmission série s'oppose à la transmission parallèle (abrégée //). On envoie les données (bits) les uns à la suite des autres, en parallèle on envoie des salves de bits sur plusieurs fils en même temps (autant de bits que de fils). On parle de bits donc bien entendu ici il s'agit d'une liaison numérique bidirectionnelle sans porteuse, donc en tout ou rien (0/1) avec deux niveaux logiques (haut et bas).

diff


Les deux étant utilisées dans le monde de l'informatique. La liaison série a pris le dessus depuis les années 90 comme par exemple les bus PCI-Express, USB et SATA qui remplacent les antiques PCI, PATA, SCSI et autres Centronics. En raison notamment de sa plus grande simplicité : moins de fils, connecteurs moins gros et moins de problèmes (diaphonie, skew). Les liaisons parallèles ne sont utilisées que sur des distances courtes (lignes des bus PCI ou de bus mémoire sur la carte mère, nappes IDE/PATA). Les liens suivants vous en apprendront plus :

Sinon vous avez ces deux excellentes vidéos de Electro Bidouilleur :

Les ports série


Sur un PC, les deux connecteurs D-Sub DB-9 et DB-25 mâles sont destinés à une liaison de type série et un connecteur DB-25 femelle est destiné à la transmission parallèle :

port


serial-label


oldports


Depuis la norme PC'98 les couleurs sont apparues (rose pour le //) :

comm


Brochage


Tous les fils ne sont pas nécessaires pour une liaison série. 3 fils sont nécessaires à minima. Mais certains équipements comme les modems peuvent nécessiter tous les fils. Plutôt que de réinventer la roue :

Les 3 fils les plus importants sont :
  • TX = TxD = transciever = transmission / envoi de données
  • RX = RxD = receiver = réception de données
  • GND = Masse

uartswizzle


Câbles croisés / droits


La communication par série se fait de manière point à point. Entre deux appareils il faudra alors croiser les broches TX et RX. Dans ce cas on utilisera un câble croisé (crossover ou Null Modem).

null_modem


Toutefois sur certains appareils les broches sont déjà croisées dans l'appareil à relier, des appareils qui ne respectent pas la bonne assignation des broches dans la norme, dans ce cas il faudra utiliser un cordon droit (straight).

straight


C'est la même chose que dans le monde des câbles réseaux de type paires torsadés Ethernet.

Le protocole UART (Universal Asynchronous Receiver Transmitter)



Le RS-232 ne définit que la connectique et le brochage grosso modo (voir articles Wikipedia), mais il ne définit pas comment l'information circule et doit être codée. C'est justement le rôle du UART de découper le flux en trames et de définir les états.
Comme son nom l'indique, l'UART est asynchrone = pas de signal d'horloge partagé sur la liaison. De ce fait la vitesse de transmission entre les deux appareils doit être accordée manuellement. La vitesse s'explique en baud et va de 110 baud jusqu'à 3 686 400 baud. On croise souvent les valeurs standardisés 9600 ou 57600. Cette vitesse est à ajuster des deux cotés.
La trame d'un Byte envoyé est constituée ainsi :

uart1


  • 1 bit de START (bit de départ)
  • n bits de données (5 à 9)
  • 0 ou 1 bit de parité
  • 1 ou 2 bit de STOP (bit d'arrêt)

Les n bits de données sont à la discrétion de l'application qui peut codifier/décoder la valeur comme elle le souhaite. Généralement on envoie de l'ASCII sur 8 bits (= 1 octet) mais pas forcément. Le plus important étant de savoir dans quel sens on doit lire les bits pour le convertir en Byte. Comme pour la lecture et l’écriture littérale il existe deux sens : de droite à gauche et de gauche à droite. C'est pour cela cela qu'il faut connaitre la notion de MSB et LSB.
Si vous n'avez aucune notion de représentation/codage binaire, voici une bonne page pédagogique : http://philippe.berger2.free.fr/automatique/cours/numeration/numeration.htm

oscilloscope_trace


La donnée binaire sur ce schéma = 11010010. Il nous est indiqué que le LSB (poids = 1) est à droite et le MSB (valeur = 128) à gauche.
La valeur décimale de cette suite de 8 bits est donc de 1 + 2 + 0 + 8 + 0 + 0 + 64 + 0 = 75 ce qui correspond à la lettre K (majuscule) dans la table ASCII.

Les adaptateurs USB


Ces adaptateurs USB jouent le rôle d'émulateur de port série une fois connectés en USB. Ils sont détectés comme tel avec le nom COMx dans le monde Microsoft DOS & Windows, où x est un identifiant de port. COM1 et COM2 sont généralement ceux intégrés à la carte mère. Au fur et à mesure que des ports sont détecté le numéro est incrémenté.

windm


Vous pouvez régler les paramètres dans les propriétés de chaque périphérique mais généralement cela peut se faire au sein des applications elles-mêmes :

termite_settings


Les contrôleurs


Ces adaptateurs comportent donc tous un circuit intégré permettant de faire la passerelle. Ils réclament souvent des drivers pour pouvoir les faire fonctionner. Si sous Linux ça passe crème directement, coté Windows il y a parfois des loupés.

FTDI - FT232R


ft232rl


Ce circuit intégré fait souvent l'objet de contrefaçon. Sur eBay on a trouve à la pelle et ce ne sont souvent des clones. Il fût une période où justement FDTI (Future Technology Devices International) avait fait la chasse aux contrefaçons. Une mise à jour du pilote Windows rendait inutilisable la puce si elle était détectée comme contrefaite. Et ce par le biais d'une reprogrammation (volontairement) mal faite (brickage). Le hic étant que cette puce contrefaite pouvait être implantée également sur des Arduinos et pas seulement sur des simples adaptateurs USB/Série. Beaucoup de gens se sont retrouvés avec une puce HS sur les bras. Cela avait fait un petit scandale à l'époque nommé le FDTIgate. Le EEVBLOG avait évoqué l'affaire dans sa vidéo n°676. Il existe un procédé pour débricker les puces. Décrit ici en vidéo. Depuis la compagnie à fait machine arrière.

Prolific PL2303


pl2303hx


Ce circuit intégré fait souvent l'objet de contrefaçon également. Si vous téléchargez le pilote original, il est fort probable qu'il ne fonctionne pas. Le périphérique ne démarre pas et une icône bizarre apparait dans le gestionnaire de périphérique avec le fameux "Code 10". Là encore on suppose que depuis une certaine version, le pilote refuse de fonctionner si le chip n'est pas original. Dans ce cas il vous faudra partir à la pêche au pilote compatible ou retourner sur une vieille version comme la 3.3.2.102. Attention parce que certains de ces pilotes alternatifs peuvent générer des écrans bleus (BSOD). Si les BSOD proviennent de ser2pl64.sys ou ser2pl.sys ne cherchez pas et trouvez-vous un autre pilote qui marche cette fois.

WinChipHead CH340/CH341


ch341a


Alternative moins chères aux puces FTDI. Ce sont celles avec lesquelles j'ai eu le moins de soucis.

Quelques logiciels de terminaux pour dialoguer


Pour Windows : PuTTY, Termite, RealTerm, hypeterminal
Pour Linux : minicom
Pour les Arduino, on pourra utiliser l'utilitaire "Serial Monitor" intégré à l'IDE.

Avec Linux


N'ayant jamais eu besoin de développer quelque chose ayant besoin de liaison série dans un environnement Linux, je ne serais pas d'une grande aide. Mais voici les bases :

Ou trouver les ports série ?


Code BASH :
[jonathan@localhost ~]$ dmesg | egrep "(ttyS|ttyUSB)"
[    0.582796] 00:08: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    0.603653] 00:09: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A

Comme vous le savez sous Linux tout est fichier :
Code BASH :
 
[jonathan@localhost ~]$ ll /dev | egrep "(ttyS|ttyUSB)"
crw-rw----. 1 root dialout   4,  64 21 juil. 07:05 ttyS0
crw-rw----. 1 root dialout   4,  65 21 juil. 07:05 ttyS1
crw-rw----. 1 root dialout   4,  66 21 juil. 07:05 ttyS2
crw-rw----. 1 root dialout   4,  67 21 juil. 07:05 ttyS3

Utiliser la commande setserial pour afficher l'état et définir les propriétés du(des) port(s).
Code BASH :
[root@localhost ~]# setserial -ga /dev/ttyS[0-3]
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
    Baud_base: 115200, close_delay: 50, divisor: 0
    closing_wait: 3000
    Flags: spd_normal skip_test
/dev/ttyS1, Line 1, UART: 16550A, Port: 0x02f8, IRQ: 3
    Baud_base: 115200, close_delay: 50, divisor: 0
    closing_wait: 3000
    Flags: spd_normal skip_test
/dev/ttyS2, Line 2, UART: unknown, Port: 0x03e8, IRQ: 4
    Baud_base: 115200, close_delay: 50, divisor: 0
    closing_wait: 3000
    Flags: spd_normal skip_test
/dev/ttyS3, Line 3, UART: unknown, Port: 0x02e8, IRQ: 3
    Baud_base: 115200, close_delay: 50, divisor: 0
    closing_wait: 3000
    Flags: spd_normal
 

Minitel <> Linux


minitel


Sachez qu'il est possible aussi d’accéder à une machine Linux via port série, tel un serveur accessible via un vieux terminal passif. Soit en configurant Grub, soit laisser le système d'init/systemd démarrer la console d'écoute sur un ttyS. D'où le fait que certains pilotent leur serveur Linux via un Minitel.

Attention le minitel est en TTL et non en CMOS, si vous utilisez l'antique port série directement, il faudra passer par un montage adaptateur à base de transistors ou de MAX3232 entre le Minitel et le port série de la carte mère. Par contre les adaptateurs USB font généralement directement la conversion vers TTL.

Plus d'infos



Programmation


Dans n'importe quel langage (Perl, Python, Java, VB, C#, etc...), généralement on suit le paradigme suivant :
  • Instanciation d'un objet dans la bibliothèque (ou une API) qui permet de manipuler le port que l'on souhaite.
  • Définir les paramètres du port (réglages UART).
  • Définir des buffers d'E/S.
  • Utilisation de la fonction Open, pour ouvrir et avoir un accès (exclusif) au port que l'on souhaite.
  • Utilisation des fonctions du type Read/Write pour recevoir/envoyer des données sur le port.
  • Utilisation de la fonction Close, pour fermer le port (et ainsi le laisser libre pour d'autres applications).

python64 Full examples of using pySerial package
perl64 Serial Communication in Perl
csharp64 How To Work With C# Serial Port Communication
vb64 Serial Port Communication in VB.Net
vb664 Programmer le port série en VB avec le contrôle MSComm
java64 Serial Communication in Java with Example Program
lazarus64 Bibliothèques et composants : serial / TcomPort / TLazSerial