TP3 – Liaison série asynchrone

Download Report

Transcript TP3 – Liaison série asynchrone

TP3 – Liaison série asynchrone
Objectifs :
- Utiliser le périphérique de liaison série asynchrone sous Linux
- Programmer ae liaison série en C avec les fonctions de la bibliothèque « wiring pi ».
1. Liaison série entre Raspberry Pi et PC
L’USART (la liaison série asynchrone) du SoC BCM2835 est traité sous Linux comme un fichier
spécifique propre au périphérique (device file). Celui-ci est ainsi nommé « ttyAMA0 » dans la
Raspberry Pi.
(tty étant l’abréviation de TeleTYpe, ce sont les « terminaux virtuels » (les consoles) que vous utilisez.)
AMA0 ???
On le trouve dans le répertoire /dev qui contient les fichiers spéciaux permettant la
communication avec les périphériques (device files) : /dev/ttyAMA0.
Dans l’installation de Raspbian, le noyau (Kernel) est prévu pour gérer la liaison série à la
vitesse de 115200 Bauds avec un format 8 bits, 1 bit de stop, sans parité. Nous pouvons le
vérifier en tapant dans une console :
-
Taper : ps -aux | grep ttyAMA0
La commande ps permet d’afficher les processus actifs en cours d’exécution sous Linux
(comme sous Windows, un processus correspond à un programme utilisateur ou de l’OS).
Cette commande est associée aux options aux : a liste tous les processus (all) ; u affiche
l'utilisateur des processus (user) et x affiche la liste des processus sans terminal (terminal x).
La commande grep permet simplement de filtrer les informations affichées : elle recherche
les processus actifs possédant la chaine de caractères « ttyAMA0 ».
Enfin, le pipe (symbole « | ») permet de chainer des commandes, c’est-à-dire connecter la
sortie d'une commande à l'entrée d'une autre commande. Ainsi, dans ce cas, la liste des
processus actifs obtenue par la commande ps est transférée directement à la commande grep
qui en recherchera les processus utilisant le terme « ttyAMA0 ».
>> Cette association de commandes chainées doit nous permettre de voir qu’un processus
utilise le terminal ttyAMA0.
Nous pouvons visualiser et modifier les paramètres de ce périphérique de communication
série (le terminal) avec la commande stty :
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
1
-
Taper : sudo stty -F /dev/ttyAMA0 –a
L’option –F permet de spécifier le périphérique ciblé et le paramètre –a permet d'afficher
l'ensemble des paramètres du terminal. L'exemple ci-dessus nous indique quelles valeurs sont
affectées aux caractères de contrôle de ce terminal (effacement, interruption, etc...). Nous
voyons notamment que la vitesse de transmission est fixée par défaut à 115200 Bauds.
Pour manipuler la liaison série, il est nécessaire de relier la carte Raspberry Pi à un autre
dispositif. Nous connecterons la carte Raspberry Pi à un PC fonctionnant sous Windows.
La norme RS232 utilisée en sortie du PC impose des niveaux de tension allant entre +12 V
(niveau logique ‘0’ → 0 V au niveau de la Rasberry Pi) et -12V (niveau logique ‘1’ → 3,3 V au
niveau de la Raspberry Pi).
Une adaptation de tension doit ainsi être faîtes. Une solution utilisant le circuit MAX232
(fabricant Maxim) est souvent utilisée dans ce cas. Toutefois, la disparition des connecteurs
DB25 et DB9 des PC assurant la communication série RS232, impose l’utilisation de l’interface
USB, c’est-à-dire un bus série synchrone rapide pour émuler la transmission série asynchrone
plus lente.
Certains circuits intégrés assurent ainsi ce « pont » (bridge) entre ces deux standards de
communication. Dans ce TP, nous utiliserons le circuit PL2303TA fabriqué par la société Prolific
Technology Inc.
La mise en œuvre de ce circuit intégré étant néanmoins complexe et délicate (besoin de
plusieurs composants passifs annexes à ce circuit, soin apporté au câblage pour éviter les
perturbations électromagnétiques, etc.), nous incite à utiliser un adaptateur « tout fait »
utilisant ce circuit et commercialisé par la société Adafruit :
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
2
Un pilote logiciel (driver) sera installé automatiquement sous Windows 8, dès la connexion de
ce module sur une des prises USB du PC. Pour les systèmes d’exploitation Windows 7, Vista
ou XP, il sera nécessaire de télécharger et d’installer le pilote à partir de l’adresse internet :
http://adafru.it/954
Puis dans la rubrique « Technical Details », il faudra cliquer sur « Windows
XP/Vista/7/8 PL2303 driver ».
Nous pourrons alors vérifier la prise en charge de ce nouveau périphérique par Windows dans
le « Gestionnaire de périphériques ».
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
3
>> Noter le numéro de port COM associé (dans l’exemple COM5)
Cet adaptateur possède 4 fils : un fil rouge pour l’alimentation, un fil noir pour la masse, un fil
blanc pour le signal de réception RX (vu côté PC) et un fil vert pour le signal d’émission TX (vu
côté PC).
La broche d’alimentation fourni 5 V et jusqu’à 500 mA (cette broche ne sera pas utilisée dans
ce TP). Les broches RX/TX ont des niveaux de tension entre 0 V et 3,3 V qui permettent leur
connexion directement sur les GPIO de la RasPi. Pour rappel, le dessin ci-joint indique en gris
la broche de transmission TX (vu côté RasPi, boche n°8 sur le connecteur) et la broche de
réception RX (vu côté Raspi, broche n10) : Il sera bien entendu nécessaire de croiser les fils TX
et RX entre la RasPi et le PC !
>> Connecter les fils.
Pour dialoguer entre le PC et la carte Raspberry Pi, nous allons utiliser de nouveau l’utilitaire
« Putty » déjà installé lors du TP2.
>> Saisir les paramètres comme indiqué ci-dessous :
- Dans la fenêtre « Category », sélectionner « Serial »
- Dans le champ « Serial line to connect to », indiquer le numéro de COM utilisé par
windows pour l’adaptateur.
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
4
-
Dans le champ « Speed (baud) » : mettre la vitesse maximale utilisée par défaut par Linux
pour ce périphérique, c.à.d. 115200
Dans le champ « Data bits » : 8
Dans le champ « Stop bits » : 1
Dans le champ « Data bits » : 8
Dans le champ « Parity » : None
Dans le champ « Flow Control » : None
Puis cliquer sur « Sessions » et sélectionner « Serial ». Enfin, cliquer sur le bouton « Open ».
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
5
Une fenêtre représentant une console Linux doit apparaître. Si aucun message n’est présent
dans cette fenêtre, appuyer sur la touche « Entrée » du clavier du PC :
Il est désormais possible d’exécuter les commandes et vos programmes depuis cette fenêtre
après avoir saisi votre nom d’utilisateur et votre mot de passe.
Si nous voulons simplement transférer des messages de la Raspberry Pi vers le PC, nous
utilisons la commande echo :
-
Taper : echo "bonjour PC…" > /dev/ttyAMA0
Dans la fenêtre de Putty nous devrions voir afficher le message transmis. Par contre, si nous
voulons recevoir un message provenant du PC, nous utilisons la commande de lecture de
fichier cat :
-
Taper : cat /dev/ttyAMA0
Ainsi les messages écrits dans la fenêtre Putty devraient s’afficher dans votre console Linux.
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
6
2. Utilisation de la liaison série en programmation C
2.1 Suppression de la liaison série dans le noyau Linux
Comme nous venons de le voir, la liaison série est accaparée par le noyau Linux. Pour éviter
ainsi tout conflit entre le noyau et les programmes que nous allons écrire, il faut dire au kernel
(noyau) de ne pas se servir de la liaison série au démarrage et ne pas créer un terminal sur
cette liaison.
Pour supprimer l’utilisation de l’UART au démarrage, il faut éditer le fichier /boot/cmdline.txt,
et supprimer toutes les références à ttyAMA0 :
-
Taper : sudo cp /boot/cmdline.txt /boot/cmdline.old
Taper : sudo nano /boot/cmdline.txt
>> supprimer : console=ttyAMA0,115200
>> supprimer : kgdboc=ttyAMA0,115200
>> Sauvegarder le fichier
Pour désactiver le terminal sur l’UART, il faut éditer le fichier /etc/inittab et supprimer ou
commenter (en ajoutant un # en début de ligne) les lignes faisant référence à notre UART :
-
Taper : sudo cp /etc/inittab /etc/inittab.old
Taper : sudo nano /etc/inittab
>> Commenter la ligne :
T0:23 :respawn:/sbin/getty –L ttyAMA0 115200 vt100
>> En ajoutant devant le symbole # :
#T0:23 :respawn:/sbin/getty –L ttyAMA0 115200 vt100
>> Sauvegarder le fichier et redémarrer la carte RasPi
-
Taper : reboot
Après le redémarrage, on vérifie que plus aucun processus n’utilise « ttyAMA0 » et qu’aucun
terminal n’est connecté à la liaison série :
-
Taper : sudo stty -F /dev/ttyAMA0 –a
Taper : ps -aux | grep ttyAMA0
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
7
2.2 Réception de caractères provenant du PC
Le programme C que nous allons réaliser va recevoir des caractères provenant du PC tant que
la touche d’espace (caractère ‘ ‘) ne sera pas tapée.
>> Créer un nouveau projet nommé « ProjetUSART » sous geany.
>> Créer un nouveau fichier (selon le modèle main.c) et taper le programme ci-dessus.
>> Nommer ce programme « usart_v1.c »
Quelques commentaires par n° de lignes :
2 > le fichier d’en-tête wiringSerial.h est obligatoire pour pouvoir utiliser les fonctions wiringPi
utiles à l’interface série
9 > la fonction « serialOpen » ouvre et initialise le port série en spécifiant le débit (115200
Bauds). La valeur retournée est le « file descriptor » (référence vers une structure décrivant
un fichier) ou -1 en cas d'erreur.
13 > la fonction « serialGetchar » retourne le prochain caractère disponible sur le port série
indiqué par le « file descriptor ».
14 > la fonction « putchar » (définie dans le fichier d’en-tête stdio.h) envoie le caractère vers
le flux de sortie standard « stdout » (l’écran).
15 > la condition de sortie de la boucle consiste à attendre l’appui sur la touche espace.
>> Dans le Terminal de « geany », compiler le programme :
-
Taper : gcc –Wall usart_v1.c –l wiringPi –o usart_v1
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
8
>> corriger éventuellement les erreurs et recompiler de nouveau si nécessaire.
>> Exécuter le programme :
-
Taper : ./usart_v1
Nous utiliserons de nouveau l’utilitaire « Putty » pour émuler un terminal sous Windows.
Remettre les mêmes paramètres que pour l’exercice précédent. Dans la fenêtre qui s’est
ouverte, taper des caractères quelconques puis appuyer sur la touche espace.
>> Que s’est-il passé ?
Vous aurez sans doute remarqué que les caractères tapés dans la fenêtre ouverte par « Putty »
sont apparus uniquement lorsque le programme s’est terminé, c’est-à-dire lorsque la touche
d’espace a été appuyée.
Cela correspond à une utilisation de la mémoire tampon (par la fonction « putchar( ) ») dans
le flux de données standard sortant « stdout ». Cela signifie que le système d’exploitation
stocke tous les caractères dans une mémoire temporaire, jusqu’à ce que celle-ci soit lue
suivant certaines conditions. Le fait de quitter le programme correspond à l'une de ces
conditions : Cette action ferme notamment les flux de données (en entrée et en sortie) et
« purge » ainsi la mémoire tampon, permettant ainsi son affichage en dehors du programme.
Pour lire le contenu de la mémoire tampon pendant l’exécution du programme, nous pouvons
faire appel à la fonction « fflush » dont le rôle est de vider la mémoire tampon d’un flux ciblé
(entrant ou sortant).
Le prototype de cette fonctions est : int fflush (FILE *flux);
Dans notre cas, Le paramètre à fournir, représenté comme un pointeur, correspond au flux de
sortie standard « stdout ».
La valeur retournée de cette fonction correspond à une valeur égale à 0 si la fonction réussie
ou EOF (End Of File) si elle échoue. Nous n’utiliserons pas la valeur retournée et appellerons
directement la fonction sans prendre en compte la valeur retournée.
>> Modifier le programme comme indiqué ci-dessous et sauvegarder le comme « usart_v2.c ».
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
9
>> Compiler le programme et nommer l’exécutable « usart_v2 »
>> Tester le.
2.3 Réception et transfert de caractères entre PC et Raspberry Pi
Nous pouvons désormais compléter ce petit programme pour qu’il puisse retourner au PC le
caractère tapé, mais légèrement modifié. Par exemple, la valeur ASCii du caractère reçu peut
être incrémentée de 1 pour retourner au PC la lettre de l’alphabet se trouvant juste après : Si
‘a’ est tapé, nous devrions voir ‘b’, etc.
>> Compléter le programme précédent en essayant d’utiliser la fonction « serialPutchar » de
la bibliothèque « wiring Pi ».
>> Nommer ce fichier « usart_v3.c ».
>> Compiler le programme et nommer l’exécutable « usart_v3 »
>> Tester le.
2.4 Réception de caractère depuis le PC et sauvegarde de la chaîne de caractères
Dans un dernier exercice nous voulons sauvegarder les caractères provenant du PC dans une
chaîne de caractères (un tableau de caractères) tant que la touche « Entrée » n’est pas
appuyée.
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
10
Nous utiliserons l’algorithme ci-dessous. A la place du code ASCii correspondant à la touche
« Entrée » nous insérerons la valeur 0 dans le tableau qui signale la fin de chaîne de caractères.
Attention, la fonction d’affichage utilisée à la fin permet de contrôler visuellement le contenu
du tableau. N’oublions pas le retour à la ligne avant et après pour faire apparaître le texte
dans la console. Sans cela, le texte sera recouvert du texte du prompt de la console.
>> Ecrire le programme C correspond et nommer le « usart_v4.c »
>> Compiler le programme et nommer l’exécutable « usart_v4 »
>> Tester le.
ACTION PRINCIPALE
Variables : fd (entier), i (entier), tab[100] (caractères)
DEBUT
fd ← serialOpen("/dev/ttyAMA0", 115200)
i←0
FAIRE
tab[i] ← serialGetchar(fd)
(réception d’un caractère vers tab[i])
Putchar(tab[i])
(envoi de tab[i] sur le flux de sortie stdout)
fflush(stdout)
(purge de stdout)
i←i+1
TANT QUE (tab[i-1] ≠ touche « Entrée »)
tab[i-1] ← 0
Afficher (retour à la ligne + contenu de Tab + retour à la ligne)
FIN PRINCIPALE
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
11