11.5 INTERFACE SÉRIE

 

 

INTRODUCTION

 

Bien que les interfaces Bluetooth, Ethernet et USB soient communément utilisées pour la communication entre un ordinateur et ses périphériques, la communication par interface série (RS-232C) est toujours largement utilisée puisqu’elle nécessite des circuits de contrôle bien moins complexes dans les appareils. C’est la raison pour laquelle les interfaces séries sont encore très utilisées pour connecter des appareils de mesure (voltmètres, oscilloscopes, etc…) aux appareils de contrôle et aux robots ou pour communiquer avec des microcontrôleurs. Les ordinateurs modernes n’ont plus de port série mais il est très facile de se procurer à bon prix un adaptateur USB vers port série.

Pour comprendre les interfaces série, il faut comprendre qu’elles comportent des lignes pour envoyer et recevoir des données (TD/TR), deux paires de lignes de poignée de main (handhake line en anglais) RTS/CTS et DTR/DSR, deux lignes d’état (status en anglais) CD/RI et une ligne de masse (ground en anglais). On peut observer les lignes de sortie TD, RTS, DTR et les lignes d’entrée RD, CTS, DSR, CD, RI présentes sur le port d’un vieil ordinateur. Les lignes RTS et DTR peuvent être activées et désactivées par le programme et les lignes CTS, DSR, CD et RI ne sont accessibles qu’en lecture.

Connexions du connecteur 9-pin RS-232 :

Le format des données transmises est simple. Il est constitué d’octets de données transmis chronologiquement en série (les uns après les autres). Le transfert débute par un bit de démarrage (start bit) qui permet au périphérique en réception de prêter attention aux données qui vont être transférées. Les données à proprement parler suivent ensuite en 5, 6, 7 ou, le plus souvent, 8 bits. Afin de faciliter la correction d’erreur, ces bits sont généralement suivis d’un bit de parité qui indique si un nombre pair ou impair de bits de données à 1 ont été envoyés. Ce bit n’est cependant pas obligatoire et peut être omis. Le transfert est terminé par un ou deux bits d’arrêt (stop bit). Les appareils émetteur et en réception ne sont pas synchronisés l’un avec l’autre : le transfère peut débuter et se terminer à n’importe quel moment. Il est cependant nécessaire que les deux appareils se mettent d’accord sur la durée d’un seul bit. Cette valeur est spécifiée en bauds (bit / seconde) et est généralement restreinte à l’une des valeurs standard suivantes : 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 bauds. De plus, les deux appareils peuvent se mettre d’accord sur une poignée de mains (contrôle de flux) leur permettant de s’informer s’ils sont prêts pour le transfert. On peut distinguer entre les poignées de mains matérielles (utilisation des lignes de poignées de mains de l’interface série) et logicielles (insertion de caractères ASCII spéciaux (XON/XOFF) dans le flux de données.

Une configuration de port série typique est donc constituée des informations suivantes : le débit en bauds, le nombre de données à transmettre, le nombre de bits d’arrêts, le bit de parité (aucune, pair, impair), la poignée de mains (aucune, matérielle, logicielle).

Voici comment se présenterait un diagramme temporel du voltage sur la ligne de données pour transmettre la lettre 'B' avec la configuration 7 bits de données/pas de parité/1 bit d’arrêt.

 

 

INSTALLATION

 

Le module pySerial décrit dans cette section fonctionne sur un système 32 ou 64-bit, mais uniquement sur un Java Runtime Environment (JRE) 32 bits. Il faut effectuer les opérations supplémentaires décrites ci-après (Lib est un sous-dossier du dossier dans lequel l’archive tigerjython2.jar est située):

1.

Télécharger pyserial.zip décompresser l’archive puis copier l’intégralité de son contenu dans le dossier Lib.

<tigerjythonhome>
    Lib
        Serial
            tools
            urhandler

2. Télécharger javacomm.zip. Décompresser l’archive et copier comm.jar dans le dossier Lib.

3. (Sur Windows): copier le fichier win32com.dll présent dans l’archive javacomm.zip dans le dossier c.\windows\system32. Dans c:\Program Files (x86) se trouve le dossier Java et le répertoire de base de la JRE. Copier le fichier javax.com.properties présent dans le fichier javacomm.zip vers le sous-dossier Lib. (Remarque : Lors d’une mise à jour de la JRE, il peut être nécessaire de recopier ce fichier.)

4. Si nécessaire, installer le driver de l’adaptateur USB et connecter l’adaptateur au port USB. Chercher ou réinitialiser le port COM attribué dans la section « Ports (COM et LPT) » du gestionnaire de périphériques de Windows, par exemple COM1 ou COM3.

5. Tester l’installation en exécutant (double clic) l’archive JAR PortEnumerator.jar (présente dans javacomm.zip). Le port COM utilisé devrait être affiché.

SIMPLE TERMINAL

Pour le moment, il vous faudra vous contenter de la documentation de pySerial. Sur la page https://github.com/pyserial/pyserial sous pySerial API, on trouve une description complète des classes nécessaires. Certaines d’entre elles sont cependant dépendantes de la plateforme.

Le programme suivant permet d’envoyer à un périphérique externe les caractères saisis au clavier les uns après les autres et d’afficher dans la console les caractères reçus. C’est la forme la plus simple d’un émulateur de terminal. Pour le tester, deux options se présentent. La première consiste à connecter à l’autre extrémité un ordinateur configuré de manière appropriée sur lequel vous exécutez également le même programme. Pour que cela fonctionne, il faut utiliser un câble série spécial qui croise les lignes RD (Receive Data) et TD (Transmit Data). La deuxième possibilité consiste à relier les pins RD et TD de votre port série par un fil ou un autre objet conducteur, ce qui aura pour effet d’afficher dans la console les caractères saisis puisque les données envoyées en sortie de l’interface série seront immédiatement retournées en entrée.

import serial
from gconsole import *

makeConsole()
setTitle("Terminal")
ser = serial.Serial(port = "COM11", baudrate = 115200, timeout = 0)
while not isDisposed():
    key = getKey()
    if key != "":  # a key is typed
        if ord(key) == 10: # cr key pressed
            key = "\r"
        ser.write(key)
    nbChars = ser.inWaiting()   
    if nbChars > 0:
        text = ser.read(nbChars)
        for ch in text:
            if ch == '\n':
                gprintln()
            else:   
                gprint(ch)
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

Pour lire les caractères reçus en entrée de la ligne, il faut utiliser une fonction non bloquante puisque le programme doit sans arrêt vérifier si une touche du clavier a été pressée. La méthode ser.read() est non bloquante si le paramètre de timeout du constructeur et mis à 0.

Si vous avez un notebook disposant d’un modem intégré, le programme de terminal peut l’utiliser pour communiquer avec le jeu de commandes Hayes comme le montre la figure ci-dessous.