Vous êtes sur la page 1sur 6

DUT informatique, TP info embarque n3, anne 2015

P. Kauffmann
MODULE INFORMATIQUE EMBARQUEE

Communication srie
RS232

1. Prsentation
De nombreux systmes embarqus communiquent avec lextrieur via une liaison filaire,
radio ou infrarouge. Beaucoup de ces interfaces de communication utilisent la liaison srie
asynchrone RS232 pour se connecter au microcontrleur.

Dans ce TP de 2 h, nous allons mettre en place une application embarque qui gnre un
signal priodique quelle communique via un port srie RS232 directement au PC du poste de
travail qui fournira une IHM graphique dporte capable d'afficher sous forme de courbe
lvolution temporelle du signal en fonction du temps.

2. Objectif(s) oprationnel(s)
Devenir capable dcrire un pilote de priphrique RS232,

3. Organisation matrielle
Le TP sera ralis par un groupe de deux tudiants. Le TP fera l'objet dun rapport crit
contenant les rponses aux questions et le code des fonctions demandes, rendu en fin de
sance sur papier.

4. Documentation et matriel ncessaire


Les documentations ncessaires pour la ralisation de ce TP sont :

polycopi de cours sur les microcontrleurs,


notes de cours personnelles,
documentation lectronique de la famille RX62,
les schmas de la plateforme cible.

Le matriel ncessaire pour la ralisation de ce TP est :

un ordinateur compatible PC avec la chane de dveloppement RX62,


un systme RX62N avec carte prototypage rapide.

5. Prsentation des interfaces de communication


5.1. Rappels sur la liaison srie RS232

La liaison srie RS232 est un protocole de communication datant des annes 1950 largement
utilis durant toutes les priodes de l'informatique et qui reste essentiel de nos jours comme
interface pour les systmes de communication plus volus. Il a t conu au dpart pour
relier un ETTD (Elment Terminal de Traitement de Donnes), c'est dire un ordinateur,
imprimante, console, etc. un ETCD (Elment Terminal de Communication de Donnes),
c'est--dire un modem.

Nous allons utiliser cette liaison pour connecter notre systme embarqu base de RX62N
qui se comporte comme un ETCD au PC du poste de travail qui se comporte comme un
ETTD et qui nous servira dIHM.

Dans une liaison srie asynchrone il faut choisir plusieurs paramtres et faire des choix
identiques pour les deux entits connectes ensembles. Les choix faire sont :
la vitesse de transmission en Bauds : 110,, 9600, , 115200, ou plus (sous
condition),
la parit (paire, impaire ou sans),
le nombre de bits de donnes par caractre (5 8),
le nombre minimal de bits darrt (1, 1,5 ou 2),
le mode de contrle de flux (hard, soft ou absent).

En ce qui nous concerne, nous allons communiquer sans contrle de flux et sans parit, en 8
bits avec 1 bit darrt au moins et 115200 Bauds (vitesse maximale sur les PC).

6. Le SCI (Serial communication Interface) du RX62N en


mode asynchrone (RS232)
6.1. Principe gnral

Le RX62N dispose de six ports srie nomms SCI pouvant fonctionner dans divers modes
synchrones et asynchrones. Nous allons utiliser le SCI6 qui dispose dune prise DB9 en face
latrale gauche de la carte de prototypage.

N. B. : pour fonctionner correctement, il faut passer par un petit adaptateur DB9 qui permute
des broches car le brochage dorigine nest pas standard.

Nous allons connecter la DB9 de la carte de prototypage sur ladaptateur USB/srie du PC via
un cble srie. Cet adaptateur est reli par un pilote de priphrique au port srie COM1 du
PC (connecteur 9 broches situ larrire des machines de la salle de TP).

On peut distinguer plusieurs mthodes de gestion du port srie :


mode alternat, cest--dire une direction aprs lautre (impossibilit de recevoir
lorsquon met),
mode full duplex , mission et rception simultan. Rception au moins sous
interruption.
La seconde mthode est plus performante, mais ncessite plus de code car la bibliothque
RPDL ne fournit pas de code pour fonctionner en mode full duplex .

Pour exploiter le port srie on va raliser une classe sci minimaliste qui ne sait grer quun
port srie (le numro 6) et offre un service minimal avec un seul constructeur sci(uint8_t
priority, uint32_t speed) qui initialise le port srie et une seule mthode void
sciTrans(uint8_t * string) qui met dans le registre dmission du port srie le
premier caractre de la chane de caractres mettre avec linstruction SCI6.TDR =
m_sciTX6message[0]; .

Pour exploiter le port srie en full duplex sous interruption il faut aussi deux fonctions
sciSend() et sciReceive() qui ne peuvent pas tre des mthodes car ce sont des
fonctions dinterruption. Leur code est prsent sous cette forme aux paragraphes 6.3 et 6.4.
Toutefois, il est parfaitement possible dutiliser des mthodes de mme nom ; les fonctions
dinterruption se contentant alors dappeler ces mthodes. Cette manire de faire trs gnrale
doit tre privilgie.

Elles ont besoin davoir accs aux attributs publics suivants de la classe :

// for reception
volatile uint8_t m_sciRXmessage[128];
volatile bool m_sciRXfree;
// for transmission
volatile uint8_t m_sciTXmessage[64];
volatile bool m_sciTXfree;

sciSend() met sous interruption tous les caractres except le premier ; les caractres
tant prlevs dans le tampon dmission m_sciTXmessage[].sciReceive() reoit tous
les caractres sous interruption, les place dans le tampon m_sciRXmessage[] et dsactive
le fanion m_sciTXfree pour indiquer la fin de lopration.

6.2. Initialisation

Pour initialiser la liaison srie de SCI6 dans le microcontrleur on pourra utiliser le canevas
ci-aprs en ajoutant les valeurs numriques manquantes.

sci::sci(uint8_t priority, uint32_t speed) {


/* Declare error flag */
bool err = true;
/* select A pins for SCI 6 */
err &= R_SCI_Set(xx);
/* Configure SCI6 in asynchronous, 8N1 mode */
err &= R_SCI_Create(xx);
// define priority of SCI6 interrupts
IPR(SCI6, ) = priority;
// activate transmission interrupt
IEN(SCI6,TXI6) = xx;
// activate reception interrupt
IEN(SCI6,RXI6) = xx;
// enable full duplex communication under interrupt
SCI6.SCR.BYTE |= 0xF0;
// SCI6 is free at this time
m_sciRXfree = m_sciTXfree = xx;
/* Halt in while loop when RPDL errors detected */
while(!err);
}

6.3. Fonctions dmission

La mthode dmission du premier caractre place dans le fichier de classe sci.cpp aura
un code semblable celui donn ci-aprs :

void sci::sciTrans(uint8_t * string)


{
// string memorization
strcpy((char *)m_sciTXmessage, (char *)string);
// say SCI occupied
m_sciTXfree = false;
// transmit first character
SCI6.TDR = m_sciTXmessage[0];
}

La fonction dinterruption, place galement dans le fichier de classe sci.cpp grant


lmission du second au dernier caractre, dont le canevas complter est donn ci-aprs,
assurera lmission sans gestion de flux. Elle utilise lobjet sci6 de la classe sci instanci
statiquement.

void sciSend(void)
{
static uint8_t messByte = xx; // number of transmitted
characters

if(messByte>62) messByte = xx; // avoid overflow


if (sci6.m_sciTXmessage[messByte] == xx) // last character ?
{
messByte = xx;
sci6.m_sciTXfree = true;
}
else
{
SCI6.TDR = sci6.m_sciTXmessage[messByte++];
}
}

N. B. : la variable messByte compte les caractres et le fanion sci6.m_sciTX6free


permet de dterminer si le port srie est libre ou occup (occup false).

6.4. Fonction de rception

La fonction dinterruption, place dans le fichier de classe sci.cpp grant la rception, dont
le canevas complter est donn ci-aprs, assurera la rception sans gestion de flux. Cette
fonction inutilise dans limmdiat sera indispensable pour les TP suivants lorsque la
communication deviendra bidirectionnelle.
void sciReceive(void)
{
static uint8_t messByte = xx;

if(messByte>126) messByte = xx; // avoid overflow

sci6.m_sciRXmessage[messByte++] = SCI6.RDR; // receive


if (sci6.m_sciRXmessage[messByte - 1] == '\n') // end of
transmission
{
sci6.m_sciRXmessage[messByte-2] = '\0'; // add end of
string
messByte = xx;
sci6.m_sciRXfree = false; // presence of new
data
}
}

N. B. : la variable messByte compte les caractres et le fanion sci6.m_sciRXfree


permet de dterminer si le port srie est libre ou occup (occup false).

6.5. Gestion des exceptions

La communication srie est susceptible de gnrer des exceptions. Ces exceptions


dclenchent des interruptions. Ceci nous oblige rajouter dans le code de gestion du port srie
les deux fonctions dinterruption ci-aprs :

void sciSendEnd()
{
sci6.m_sciTXfree = true;
// inhibit end of transmission interrupt
SCI6.SCR.BIT.TEIE = 0;
}

void sciReceiveError()
{
// clear parity error
SCI6.SSR.BIT.PER = 0;
// clear framing error
SCI6.SSR.BIT.FER = 0;
// clear overrun error
SCI6.SSR.BIT.ORER = 0;
}

7. Gestion du port srie cot PC


Une application adapte est ncessaire pour visualiser sous forme de courbe les donnes
envoyes au PC via la liaison srie. On pourra utilisera lmulateur de terminal Teraterm
plac sur toutes les machines de la salle de TP pour vrifier sous forme de texte le bon
fonctionnement des donnes transmises. Cet mulateur devra toutefois tre dabord configur
pour fonctionner correctement :
Connexion srie port COM1,
Setup -> serial port -> Baud rate 115200, Data 8 bit, Parity none, Stop 1 bit, Flow
control none.
Setup -> terminal -> Receive CR, Transmit CR+LF.

8. Manipulations
8.1. Dispositif embarqu communiquant

On se propose dutiliser le lien RS232 de la maquette vers le PC pour afficher la courbe dune
grandeur mesure par le RX62N. Comme, pour le moment, on na pas de capteur install sur
le systme embarqu, on simule le signal de mesure par un signal qui volue temporellement
priodiquement en dent de scie, signal gnr par une mthode ajoute la classe tps
nomme void tps::dentScie(). La mthode tps::dentScie()incrmente lattribut
m_dent (valeur initiale nulle) de 10 units chaque appel, et remet sa valeur 0 chaque
fois quelle atteint 400. Elle est excute 5 fois par seconde et lattribut m_dent est transmis
sur le port srie pour gnrer le signal dsir la mme frquence.

Lapplication embarque sur le RX62N aura les caractristiques suivantes :

La communication par le port srie se fera en mode asynchrone la vitesse de 115200


Bauds, 8 bits, sans contrle de flux.
La mesure obtenue par une mthode get sera transmise 5 fois par seconde en
mme temps quelle sera affiche sur lafficheur LCD embarqu (affichage lorsquon
se trouve la gestion de la ligne 5 de lafficheur et mission sans affichage lorsquon
se trouve la gestion de la ligne 6 de lafficheur).
Chaque mesure mise sur le port srie se prsentera sous la forme d'une chane de
caractres ASCII reprsentant un entier, termin par un saut de ligne et respectant la
forme suivante : 50\r\n.

Ralisez le travail suivant :

Partez su squelette fourni TP3serie . Compltez les fichiers sci.h et sci.cpp de


faon obtenir une classe sci complte.
Ajoutez dans lapplication TP3serie l instanciation statique en sci6 de la classe sci
(priorit 2 et vitesse par dfaut 115200 Bauds). Ajoutez dans le code daffichage la sixime
ligne le code de transmission de lattribut m_dent . Testez le fonctionnement avec
lmulateur de terminal TeraTerm et ventuellement le script tcl fourni.
Montrez le fonctionnement de votre application l'enseignant d'encadrement.
Si vous avez le temps, ajoutez la septime ligne le message fixe RECEPTION et sur la
suivante laffichage des chanes de caractres manant du port srie.