Projet de Fin D'Etudes
élaboré par
REBAÏ Rami & TURKI Ladhem
pour obtenir le
Le Diplôme Universitaire Technologique
(DUT)
Mise au point d'applications temps
réel : Communication entre deux ordinateurs
Encadré par :
Mlle MARAAOUI Boutheina
Année Universaitaire :
2006/2007
SOMMAIRE
INTRODUCTION
GÉNÉRALE.............................................................1
CHAPITRE 1 : ANALYSE DU CAHIER DES CHARGES
I-
INTRODUCTION...................................................................................3
II- LES CONCEPTS TEMPS
RÉELS...............................................................3
II-1- Principales caractéristiques d'un
système temps
réel ......................................3
II-2- Validité et fonctionnalité d'un
système temps réel.....................................4
II-3- Notion du temps et contraintes
temporelles..................................................4
II-4- Expression des contraintes temps
réels......................................................5
II-5- Conception et structure d'un système temps
réel ...........................................5
III- L'ANLYSE DU CAHIER DES
CHARGES...............................................6
III-1- Port série
RS232...............................................................................6
III-1-1- Définition du port série
RS232........................................................6
III-1-2- Le protocole
RS232....................................................................7
III-1-3- L'interface d'E/S séries
8250......................................................8
III-1-4- Les registres de
configuration........................................................9
III-1-5- Principe du transfert série asynchrone
sur ligne RS232.......................12
III-2- Port
parallèle ..............................................................................12
III-2-1- Les adresses des
interfaces........................................................13
III-2-2- Les registres de
l'interface ........................................................14
III-2-3- Élaboration d'un câble
null-modem ...............................................15
III-2-4- Protocole de transmission
utilisé ..................................................16
III-2-5- Transmission d'un
octet ...........................................................16
III-3- L'environnement turbo
C ..............................................................17
III-3-1- Définition du
Outport .............................................................17
III-3-2- Définition du
Inport ................................................................17
IV-
CONCLUSION................................................................................18
CAPITRE 2 : SPECIFICATION ET IMPLANTATION DU LANGAGE C
I-
INTRODUCTION..............................................................................19
II-
SPÉCIFICATION...............................................................................19
II-1- Modèle de
SA-RT..........................................................................19
II-1-1- Diagramme de contexte de
données (DCD)........................................20
II-1-2- Diagramme de
fonctionnalités........................................................21
II-1-2-1- Cas de la communication de deux PC avec le
port série RS232...........21
II-1-2-2- Cas de la communication de deux PC avec le
port parallèle...............24
III-
PROGRAMMATION.......................................................................29
III-1-
Conception...............................................................................29
III-1-1- Port
Série............................................................................30
III-1-2- Port
Parallèle........................................................................35
IV-
CONCLUSION................................................................................41
CONCLUSION
GÉNÉRALE...............................................................42
BIBLIOGRAPHIE..............................................................................43
Dédicaces
A mon Père,
En témoigne de ma reconnaissance pour tous les
efforts qu'il a
Consentis pour mon éducation
A ma mère,
Pour tous ses sacrifices qui m'ont permis de mener à
terminer mes études
A mon cher frère,
A ma chère soeur et son époux et leurs
enfants,
A tous mes amis,
A tous ceux qui m'ont aider à réaliser ce
projet
REBAÏ RamiDédicaces
Je dédie ce projet à toute ma famille en
particulier :
A mon père et ma mère qui m'ont
présenté les sacrifices nécessaires durant toute ma
scolarité.
A mon oncle, ma tante ainsi que ma grand-mère qui
m'ont soutenu en m'encourageant durant ce projet.
Ainsi qu'a mes soeurs et ma cousine et leurs maris.
Sans oublier mes amis (es) : Badr, Hazem, Hassen,
Ahmed, Rchid, Manel et tous les autres.
TURKI Ladhem
INTRODUCTION GENERALE
Les applications industrielles informatisées sont de
plus en plus développées et doivent traiter les informations et
exécuter les instructions de plus en plus vite. Pour palier à ces
contraintes, il faut donc mettre en oeuvre de nouveaux concepts
intégrant des caractéristiques spécifiques au temps
réel. Les applications temps réel font appel à un
environnement de plus en plus complexe pour des raisons de coût et
d'efficacité [1].
Les systèmes informatiques temps réel se
différencient des autres systèmes informatiques par la prise en
compte de contraintes temporelles dont le respect est aussi important que
l'exactitude des résultats, autrement dit le système ne doit pas
simplement délivrer des résultats exacts, il doit les
délivrer dans des délais imposés.
L'objectif de notre projet de fin d'étude consiste
à assurer des moyens permettant la communication entre deux
ordinateurs : l'émission et la réception des
données.
Afin d'atteindre notre objectif, on doit d'abord analyser
notre cahier des charges tout en spécifiant les besoins demandés
et les solutions envisageables. On doit aussi présenter les
différents outils que ce soit matériel ou logiciel permettant la
communication entre les deux ordinateurs.
Dans notre projet, on est amené à assurer la
partie programmation permettant de communiquer entre deux ordinateurs à
travers un port série RS232 ou un port parallèle.
Dans le contexte du temps réels, les programmes ont
souvent à gérer des systèmes critiques. Notre but est
alors de fournir un programme fiable tout en évitant les
problèmes d'encombrement et en dépassant les contraintes
temporelles.
Ainsi, on a recours à la programmation
structurée se basant essentiellement sur des moyens de
spécification dans le but de donner une représentation abstraite
et simplifiée du fonctionnement de notre système. Parmi ces
moyens, on cite les diagrammes de flots de données dans le modèle
de SA-RT (diagramme de contexte de
données (DCD) et diagramme de fonctionnalités).
Dans ce sens, le mémoire est organisé en deux
parties décrites ci-dessous :
Un exposé sur les systèmes temps réels:
caractéristiques, fonctionnalité, contraintes temporelles... est
tout d'abord mis en relief.
L'accent est mis ensuite sur la description des
différents outils intervenant dans l'application envisagé :
la communication entre deux ordinateurs.
Le deuxième chapitre est consacré aux
différentes étapes de la programmation structurée.
L'étape de la spécification, se basant sur des outils de
modélisation, a permis de détecter, en premier lieu, les
problèmes d'encombrement qui peuvent se poser dans notre application.
Viens ensuite l'étape de conception permettant de fournir des sous
fonctions spécifiques et importantes pour la réalisation de notre
programme, la partie test et validation est alors mise en relief.
I- INTRODUCTION
Les systèmes temps réel proviennent des
évolutions des systèmes informatiques et des contraintes
temporelles en milieu industriel. Ces systèmes réduisent les
temps de réponses pour assurer la compatibilité avec les temps
d'exécution des processus. [1]
La communication entre deux ordinateurs nécessite
l'utilisation d'un port (séries, parallèle...).
Dans ce chapitre, une analyse du cahier de charges
précisant les besoins et présentant les solutions
envisagées est effectuée. On donnera, en premier temps, une
étude sur les systèmes temps réels. Puis, une description
du matériel utilisé (type de port, environnement choisi...)
permettant la communication entre deux ordinateurs, sera introduite.
II- LES CONCEPTS TEMPS REEL
II-1- Principales caractéristiques d'un système
temps réel
Un système temps réel est
caractérisé par :
· son interaction avec l'environnement externe,
· son évolution avec le temps,
· l'exploitation des ressources limitées.
Erreur ! Source du renvoi
introuvable.
Figure I-1: Structure d'un système temps
réel
Il existe plusieurs types de systèmes temps
réel:
· Systèmes transformationnels (calcul
scientifique, gestion de base de données) : ils sont
caractérisés par le fait que
ü les données sont disponibles au lancement,
ü les instants de production des résultats ne sont
pas contraints.
· Systèmes interactifs (systèmes
transactionnels ou outils bureautiques) qui ont les
caractéristiques suivantes :
ü les résultats dépendent de données
produites par l'environnement.
ü les instants de production respectent des valeurs
statistiques.
· Systèmes réactifs ou temps réel
définis par :
ü des résultats entièrement
conditionnés par l'environnement connecté,
ü des instants de production dépendant de la
dynamique du procédé.
Un système informatique est dit « Temps
réel » si il est connecté à un procédé
qu'il doit piloter en fonction de l'évolution de celui-ci.
II-2- Validité et fonctionnalité d'un
système temps réel
Un système temps réel doit posséder un
temps de réaction adapté aux événements externes et
le programme doit pouvoir traiter l'ensemble d'un flux de données
d'entrée avant qu'ils n'en reçoivent d'autres. C'est pour cela
qu'il est nécessaire de connaître les temps d'exécution
d'un programme pour connaître les limites de réactivité.
[1]
II-3- Notion du temps et contraintes
temporelles
Le temps est le facteur déterminant des systèmes
temps réel. On peut distinguer trois classes de système :
· Système souple
Ce système est moins exigeant quant au respect absolu
de toutes les contraintes temporelles. Les systèmes de cette
classe, dits temps réel souple, peuvent
souffrir un taux acceptable de fautes temporelles de la part d'une
partie des traitements et sans que cela ait des conséquences
catastrophiques. La mesure du respect des contraintes temporelles prend la
forme d'une donnée probabiliste : la qualité de
service relative à un service particulier
ou relative au comportement du système dans son ensemble ou les deux
combinés. Une problématique de cette classe de systèmes
est d'évaluer la qualité de service, avant ou pendant le
fonctionnement, que le système offre ou va pouvoir offrir en cours de
fonctionnement, en fonction des caractéristiques de l'environnement et
du système.
(La performance est
dégradée mais sans conséquences dramatiques si les
contraintes temporelles ne sont pas rencontrées).
· Système sévère
La majorité des systèmes temps réel
sévère est exclusivement constituée de traitements qui ont
des contraintes temporelles strictes : on parle de
systèmes temps réel strict.
C'est à dire qu'en condition nominale de fonctionnement du
système, tous les traitements du système doivent
impérativement respecter toutes leurs contraintes temporelles ; on
parle alors de traitements temps réel strict ou sévère.
(Les contraintes temporelles causent la défaillance du
système).
· Système ferme
Système sévère mais une faible
probabilité de manquer les contraintes temporelles est
tolérée.
II-4- Expression des contraintes temps
réels
Le fonctionnement d'un système temps réel impose
des contraintes sur le matériel (machine et environnement logiciel).
Pour palier à ces contraintes, les systèmes doivent disposer :
· d'une horloge temps réel,
· d'instructions spécialisées,
· d'interfaces adaptées aux processus
(unités d'entrées/sortie, ...),
· d'un mécanisme d'interruption tenant compte des
cadences et délais.
Les logiciels temps réel doivent disposer de langages
adaptés et d'instructions spécialisées pour permettre une
bonne gestion des relations entre processus. Les informations doivent
être traitées rapidement pour palier aux problèmes de
contraintes de temps tandis que les instructions résultantes doivent
rester dans les limites de fonctionnement nominal de la machine. [2]
II-5- Conception et structure d'un système temps
réel
Pour optimiser un système temps réel, on peut
suivre la procédure d'analyse suivante :
· Description et expression des contraintes temps
réel,
· Représentation simultanée de
l'évolution logique et temporelle du système,
· Prédiction et estimation des temps de
réponse,
· Sélection de l'architecture, du matériel
et du logiciel,
· le matériel doit conditionner les coûts de
production,
· le logiciel doit conditionner les coûts de
développement,
· effectuer un compromis et un équilibre entre
matériel et logiciel.
Une partie du logicielle permet de réaliser une bonne
gestion des ressources matérielles afin de remplir certaines
tâches ou fonctions dans des limites temporelles bien précises.
Cette partie est appelée système d'exploitation ou noyau temps
réel. Elle fournit des services basées sur les ressources
disponibles au niveau matériel.
III- L'ANALYSE DU CAHIER DES CHARGES
Afin d'assurer la communication entre deux ordinateurs, on a
besoin de deux ordinateurs, d'un câble permettant d'assurer la
communication entre ces deux PC tels que le câble série RS232 ou
un câble parallèle et d'un environnement turbo C.
III-1- Port série RS232
III-1-1- Définition du port série RS232
Chaque ordinateur possède deux ports série. Ils
prennent la forme de deux connecteurs mâles à 9 broches (pour les
PC un peu plus anciens, un des deux possède 25 broches), nommés
en standard COM1 et COM2. A l'origine, le port série était
destiné à être connecté à un modem, c'est de
là que le nom des broches est tiré. En effet, seulement trois
broches sont nécessaires pour communiquer avec un
périphérique (TxD, RxD et la masse), les autres broches
n'étant que des signaux de contrôle et d'état. Le port
série est très bien protégé contre les
courts-circuits (avec une intensité de 20mA) et les broches sont
limitées en courant. Ainsi, il est tout à fait possible
d'alimenter un petit montage électronique (par exemple les souris
séries sont alimentées par la ligne RTS). Mais, il est quand
même préférable d'avoir recours à une alimentation
externe.
Machine A Machine B
Erreur ! Source du renvoi
introuvable.
Figure I-2 : Liaison série
III-1-2- Le protocole RS232
C'est par cette norme qu'il est possible de relier deux
ordinateurs (la connexion directe par câble sous Windows), ou encore de
communiquer avec un modem ou imprimante. Ce protocole est dit full duplex car
il peut transmettre des données et en recevoir en même temps, via
les lignes RxD et TxD. Il est tout à fait possible de n'utiliser que ces
deux bornes en plus de la masse (pour la référence), en veillant
bien sûr à relier la borne TxD du premier ordinateur à la
broche RxD du second et vice versa. Le contrôle du flux de données
sera alors totalement logiciel car les bornes annexes du port ne sont pas
utilisées. Le mode de communication dit Xon/Xoff est très
répandu (avec les imprimantes séries par exemple) et permet de
contrôler l'écoulement des données en fixant dans la
mémoire deux limites, haute et basse.
Figure I-3 : Schéma du câblage
III-1-3- L'interface d'E/S séries 8250
Le composant électronique chargé de la gestion
des transmissions séries asynchrones dans les PC est appelé UART
(Universal Asynchronous Receiver/Transmitter), qui a pour fonction de
sérialiser les caractères partant sur la ligne et mettre dans un
registre en lecture les caractères arrivant par cette ligne. Lorsqu'un
caractère est transmis sur la ligne RS232 ou lorsqu'un nouveau
caractère est reçu, le circuit UART est capable d'engendrer une
interruption. Un pilote RS232 comprend une routine d'interruption capable de
stoker un caractère arrivé sur la ligne dans un tampon
circulaire, accessible par l'application. [3]
HORLOGUE
Erreur ! Source du renvoi
introuvable.
Figure I-4 : Bornes du circuit UART 8250
III-1-4- Les registres de
configuration
Le port série possède un certain nombre de
registres. Ces registres sont situés dans un composant nommé UART
(Universal Asynchronous Receiver/Transmitter), qui gère totalement le
port série et se situe sur la carte mère. Le port série
est une vieille technologie, et à l'époque, la mémoire
était rare et le moindre petit gain était apprécié.
Chaque port série possède une adresse de base qui est
généralement 0x3F8 pour le COM1 et 0x2F8 pour le COM2. Les
registres sont accessibles via un offset par rapport à cette adresse de
base, ce qui est représenté dans le tableau I-1.
Les caractéristiques des registres sont :
· Registre THR
C'est le registre d'émission. Il est chargé par
le MPU en exécutant l'instruction OUT
THR, AL. (Où THR est une
constant initialisée avec l'adresse du registre THR).
Le contenu de THR est automatiquement
copié par l'interface dans le registre à décalage
d'émission, qui permettra la sortie en série des bits sur la
sortie SOUT.
· Registre RBR
C'est le registre de réception. Les bits qui arrivent
en série sur la borne SIN du circuit entrent dans un
registre à décalage. Lorsque ce dernier est complet, il est
transféré dans RBR.
Le MPU peut lire le contenu de RBR
avec l'instruction : IN AL, RBR.
A noter que si un deuxième octet arrive avant que
RBR n'ait été lu par le MPU, il remplace
RBR : on perd le premier arrivé, c'est l'erreur
d'écrasement 26.
Adresse
|
REGISTRES
|
DLAB
|
A2
|
A1
|
A0
|
|
0
|
0
|
0
|
0
|
RBR : Registre de reception
|
0
|
0
|
0
|
0
|
THR : Registre d'émission
|
1
|
0
|
0
|
0
|
DLL : Poids faible diviseur horloge
|
1
|
0
|
0
|
1
|
DLM : Poids fort diviseur horloge
|
0
|
0
|
0
|
1
|
IER : Interrupt Enable Register
|
X
|
0
|
1
|
0
|
IIR : Interrupt Identification Register
|
X
|
0
|
1
|
1
|
LCR : Line Control Register
|
X
|
1
|
0
|
0
|
MCR : Modem Control Register
|
X
|
1
|
1
|
1
|
LSR : Line Status Register
|
X
|
1
|
0
|
0
|
MSR : Modem Status Register
|
X
|
1
|
1
|
1
|
Non utilisé
|
Tableau I-1 : Les registres de configuration
· Registre LCR (Line Control Register)
Ce registre de commande permet de définir certains
paramètres de la transmission, en fonction de sa configuration
binaire.
Bits 0 et 1 : spécifient le
nombre de bits de la donnée à transmettre (caractères de
5, 6, 7 ou 8 bits) :
Bit 1
|
Bit 0
|
Nb de bits/caractère
|
0
|
0
|
5 bits
|
0
|
1
|
6 bits
|
1
|
0
|
7 bits
|
1
|
1
|
8 bits
|
Tableau I-2 : Nombre de bits de la donnée
à transmettre
Bit 2 : spécifie le nombre de
bits STOP (s'il vaut 0 on a 1 bit de stop et s'il vaut 1 on a
2 bit de stops).
Bit 3 : spécifie la
présence (si 1) ou l'absence (si 0) d'un bit de contrôle d'erreur
(type bit de parité).
Bit 4 : s'il y a un bit de
contrôle d'erreur, le bit 4 spécifie s'il s'agit d'un bit de
parité paire (si 1) ou impaire (si 0).
Bit 5 : normalement à 0.
Bit 6 : normalement à 0.
Bit 7 : bit DLAB, permettant
l'accès aux registres DLL et DLM dans la phase
d'initialisation de l'interface.
· Registre IER
Ce registre est utilisé pour les entrées/sorties
par interruption.
Bit 0 : interruption lorsque
donnée reçue dans RBR.
Bit 1 : interruption lorsque registre
THR vide.
Bit 2 : interruption lorsque l'un des 4
bits de poids faible de LSR passe à 1.
Bit 3 : interruption sur état du
modem.
· Registre LSR
Ce registre d'état rend compte du fonctionnement de la
liaison en réception (bits 0 à 4) et en émission (bits 5
et 6).
Bit 0 : passe à 1 lorsqu'une
donnée a été reçue et chargée dans RBR.
Bit 1 : signale erreur
d'écrasement. 1 si donnée reçue et chargée dans
RBR alors que la précédente n'avait pas
été lue. Remis automatiquement à 0 par la lecture du
registre LSR.
Bit 2 : passe à 1 à la
suite d'une erreur de parité. Remis à 0 par la lecture de LSR.
Bit 3 : passe à 1 lorsque le
niveau du bit STOP n'est pas valide (erreur de format). Remis
à 0 par la lecture de LSR.
Bit 4 : passe à 1 lorsque le
niveau de la liaison est resté à 0 pendant la durée
d'émission de la donnée (problème de l'émetteur).
Remis à 0 par la lecture de LSR.
Bit 5 : passe à 1 lorsqu'une
donnée est transférée de THR vers le
registre à décalage d'émission (THR est
alors libre pour le caractère suivant).
Bit 6 : passe à 1 lorsque le
registre à décalage d'émission est vide.
· Registre IIR
IIR est utilisé pour les E/S par
interruption. Son contenu permet d'identifier la cause de l'interruption
émise par l'interface 8250.
· Registre MCR
MCR est le registre de commande du modem.
Bit 0 : commande le niveau de la borne DTR
qui informe le modem que le MPU est prêt à communiquer.
Bit 1 : commande la borne RTS qui
demande au modem d'émettre.
· Registre MSR
MSR est le registre d'état du
fonctionnement du modem. [2]
III-1-5- Principe du transfert série asynchrone sur
ligne RS232
Pour transférer de manière asynchrone des
caractères sur une ligne série, il est nécessaire de
choisir une vitesse de transfert de bits (bits par seconde ou baud rate)
convenue entre l'émetteur et le récepteur. Le caractère
comprend un bit de départ (start bit) qui permet au récepteur de
se synchroniser au premier flanc reçu et d'échantillonner les
bits successifs au milieu de leur période. [3]
III-2- Port Parallèle
Le
Port
Parallèle associé à l'
Interface
parallèle Centronics (à l'origine : LPT pour Line Printing
Terminal) est un connecteur situé à l'arrière des
ordinateurs compatibles PC reposant sur la
communication
parallèle. Elle a été conçue pour une imprimante
texte employant un jeu de caractères de 8 bits : l'ASCII. Le
nom vient des limitations de l'imprimante qui ne peut imprimer que du texte,
une ligne après l'autre.
La transmission de données
en
parallèle consiste à envoyer des données
simultanément sur plusieurs canaux (fils). Les ports parallèles
présents sur les ordinateurs personnels permettent d'envoyer
simultanément 8 bits (un octet) par l'intermédiaire de 8 fils.
[4]
Machine A Machine B
Figure I-5 : Liaison parallèle
III-2-1- Les adresses des interfaces
Il est possible de brancher à un PC jusqu'à
trois interfaces parallèles. Les espaces d'adressage
réservé à chaque interface sont :
N° Ordre
|
Nom
|
Adresse du Port
|
Type d'interface
|
1
|
LPT1*
|
3BCh-3BFh
|
Interface parallèle sur la carte graphique MDA
|
2
|
LPT2*
|
378h-37Fh
|
1er Interface
|
3
|
LPT3*
|
278h-27Fh
|
2eme Interface
|
Tableau I-3 : Les espaces d'adressage
· La première interface occupée sera
appelée LPT1, la suivante occupée sera alors LPT2 et ainsi de
suite (cette appellation est faite au démarrage de l'ordinateur). Par
exemple, s'il n'y a pas une carte graphique de type MDA (et par
conséquent l'adresse 3BCh-3BFh n'est occupée) et la
première interface parallèle est occupée, elle sera
appelée LPT1 (c'est le cas général, puisque les cartes
graphiques MDA sont anciennes). Il faut signaler que cette appellation est
gérée par le DOS.
· Pour connaître avec un programme quel port est
connecté, on peut consulter le segment variables du BIOS à
l'offset 0008h. Cette adresse contient une table de quatre mots qui
mémorisent des interfaces parallèles.
Adresse du mot
|
Contenu
|
0040h à 008h
|
Port de base du port parallèle
n°1 : LPT1.
|
0008h à000Ah
|
Port de base du port parallèle
n°2 : LPT2.
|
000Ah à000Ch
|
Port de base du port parallèle
n°3 : LPT3.
|
000Ch à000Eh
|
Port de base du port parallèle
n°4 : LPT4.
|
Tableau I-4 : Les ports de base du port
parallèle
III-2-2- Les registres de l'interface
Indépendamment de leur adressage, toutes les interfaces
parallèles présentent trois registres situés au
début de leur zones mémoire : par exemple, pour la
première interface parallèle, les registres sont à
l'adresse 378h, 379h et 37Ah. La description de ces registres se trouve
ci-dessous. Il est à remarquer que tous les bits des registres
d'interfaces sont directement reliés aux lignes de transmission du
câble.
Si on change la valeur de l'un des bits à 1, la ligne
associée est aussitôt mise à 1. Inversement, si le bit est
mis à 0, la ligne est placée à un niveau bas.
Figure I-6 : Registres de l'interface 8255
· : 0 à Erreur
· SLCT: 1 à Imprimante On-line
(selected)
· PE : 1 à L'imprimante
n'a plus de papiers
· : 0 à L'imprimante est prête
pour le prochain signal
· : 0 à L'imprimante est utilisée
· : 0 à Les données de trouve en D0 -
D7.
· AUTO FEED: 1 à AUTO Line Feed (LF à
CR)
· : 0 à Provoque un Reset de
l'imprimante
· SLCT IN: 1 à Met l'imprimante On-
Line.
· IRQ Enable : déclenche l'interruption quant
passé à 0.
Les huit bits du premier registre représentent les
données qui doivent être transférées sur les lignes
D0 - D7. Il est à noter que ce registre n'est pas destiné
à réceptionner des données. Le deuxième est en
lecture seulement, il reflète l'état des lignes d'état de
l'imprimante.
Le troisième registre sert à envoyer des
commandes à travers l'interface. Le bit 4 aide au déclenchement
d'une interruption matérielle dès que le signal passe à 0 et ainsi l'autre bout du câble parallèle
signal la réception du dernier caractère. De plus l'imprimante
peut communiquer son état avec les trois signaux SLCT (correspond
à l'état de sélecteur On-line de l'imprimante), PE (Paper
Error manque ou défaut de papier) et ERROR (autres erreurs).
L'ordinateur dispose de diverses lignes qui lui permettent de
commander l'imprimante. Elles sont AUTOFEED (pour signaler à
l'imprimante la nécessité d'ajouter un caractère LF
à chaque caractère CR), SLCT IN (mise hors ligne de l'imprimante)
et INIT (permet de réinitialiser l'imprimante). [4]
III-2-3- Élaboration d'un câble
null-modem
D'après le schéma usuel, la transmission ne peut
se faire que dans un seul sens (l'interface parallèle est
utilisée principalement pour communiquer avec l'imprimante).
L'émetteur ne peut pas recevoir des données sur les lignes D0 -
D7. Il faut alors établir une liaison bidirectionnelle pour que les
données circulent dans les deux sens librement.
On utilise à cette fin les différentes lignes
d'état qui véhiculent habituellement des informations
d'état en provenance de l'imprimante.
Figure I-7 : Schéma de câblage du
câble null-modem
III-2-4-Protocole de transmission utilisé
Le câble null-modem présenté dans la
figure I-7 permet d'envoyer simultanément (dans les deux sens) cinq bits
par lignes de données D0 - D4 dans chaque direction. Cependant il faut
réserver une ligne qui sert pour rythmer la communication. L'un des cinq
lignes va être sacrifié à cette fin (le bit). Nous présentons à la suite le protocole que nous allons
utiliser pour le transfert d'un octet.
III-2-5-Transmission d'un octet
Du coté émetteur, l'octet doit être
divisé en deux quartets pour être transféré. Donc,
le récepteur charge les bits de faible poids (de 0 à 3) dans les
bits 0 à 3 du premier registre et met le cinquième (D4) à
0 pour que le récepteur reçoive la valeur 1 sur la ligne BUSY.
Du coté récepteur, le programme doit interroger
en permanence la ligne jusqu'à ce qu'elle monte à 1 pour transformer le contenu
de deuxième registre dans une variable. Ce contenu, ainsi lu, est
renvoyé à l'émetteur par les lignes de données. Le
bit de la ligne D4 est ensuite mis à 0 pour que l'émetteur trouve
sa ligne à 1. Ce dernier va lire alors le quartet et peut le comparer au
quartet envoyé. C'est une vérification au plus bas niveau.
Le même principe est répété pour la
transmission du second quartet de poids fort. Et il ne reste que la
concaténation de deux quartets pour obtenir l'octet. L'émetteur
relie le deuxième quartet renvoyé pour contrôle, le
concatène au second et teste s'il y a conformité avec l'original.
En cas d'erreur, Une erreur est transmise au programme appelant pour
décider ce qui est de mieux.
III-3- l'environnement turbo C
Les applications industrielles informatisées sont de
plus en plus développées et doivent traiter les informations et
exécuter les instructions de plus en plus vite. Pour palier à ces
contraintes, il faut donc mettre en oeuvre de nouveaux concepts
intégrant des caractéristiques spécifiques au temps
réel.
Les applications temps réel font appel à un
environnement de plus en plus complexe pour des raisons de coût et
d'efficacité. Durant cette étude, nous utilisons l'environnement
Turbo C.
Turbo C est un langage de programmation très
utilisé en milieu industriel mais peu convivial dans l'ingénierie
industrielle.
Les deux instructions assembleur permettant au processeur de
communiquer avec les interfaces d'E/S sont IN et OUT.
Il est possible d'accéder simplement à ces
instructions en langage C, grâce aux fonctions inportb (adr) et
outportb (adr).
· Unsigned char inportb (int
address) : lit un octet à l'adresse (de l'espace
d'E/S) indiquée et la retourne.
· Void outportb (int address, unsigned char
*data) : écrit l'octet (argument data) à
l'adresse (E/S) indiquée.
III-3-1-Définition de Outportb
C'est pour envoyer un octet dans un port. Les
périphériques ont généralement une plage de ports
qui lui sont adressés. Ces ports permettent de
« communiquer » avec ces périphériques.
C'est généralement utilisé pour le port (série
pour envoyer des données du PC vers la machine connectée).
III-3-2-Définition de Inportb
C'est pour recevoir un octet dans un port. Les
périphériques ont généralement une plage de ports
qui lui sont adressés. Ces ports permettent de
« communiquer » avec ces périphériques.
C'est généralement utilisé pour le port (série
pour recevoir des données de PC).
IV- CONCLUSION
L'analyse de cahier de charges est une étape
préliminaire, voire importante, afin de permettre la conception et la
commande d'un système temps réel tout en satisfaisant les
contraintes exigées. Cette étape nous a permis, en premier temps,
de mieux connaître et choisir le matériel utilisé dans
notre application. Elle nous a encore aidé à réaliser les
autres étapes de la programmation structurée qui seront
élaborées dans le chapitre suivant.
I- INTRODUCTION
Afin de donner une représentation abstraite et
simplifiée du fonctionnement de communication entre deux ordinateurs, on
est amené d'introduire la notion de programmation modulaire.
Un programme structuré doit avoir une composition
modulaire, il faut faire une analyse descendante de l'application conduisant
à une décomposition fonctionnelle de
l'application ; « plusieurs fonctions
élémentaires indépendantes qui sont regroupés pour
réaliser l'application ».
Dans l'objectif d'arriver à la composition modulaire,
il y a certaines étapes indispensables par lesquelles on doit passer
tels que l'analyse du cahier de charges déjà
élaborée dans le premier chapitre, la spécification, la
conception, le codage et la validation fonctionnelle du projet. Ce chapitre
sera consacré à l'étude des différentes
étapes tout en l'appliquant sur l'application de la communication entre
deux ordinateurs.
II- SPECIFICATION
L'étape de spécification fonctionnelle,
liée à l'établissement du cahier des charges du
système à commander, doit être basée sur un outil
formel. La spécification d'un système est l'expression technique
du besoin auquel il doit répondre, c'est la traduction de celui-ci en
une représentation (formalisme), qui permet de décrire le
comportement et l'environnement du système sans faire appel à des
considérations informatiques. Une spécification rigoureuse sera
ensuite le point de départ de la conception du programme. On s'applique
alors à réaliser un programme le plus fidèle à la
spécification. Il existe de nombreux modèles permettant de
traiter les problèmes du temps réel.
II-1- Modèle de SA-RT
C'est une méthodologie de développement qui est
rendue indispensable pour répondre à la complexité des
systèmes modernes, associée à un besoin croissant de
qualité dans l'accomplissement d'un projet temps réel. Dans ce
cadre, la méthodologie SA-RT (System Analysis - Real Time) apporte une
réponse : elle dissocie le modèle des besoins de celui
d'architecture, tout en prenant en compte les aspects temporels sur
différents processus.
En effet, SA-RT est une méthode de spécification
des systèmes temps réel. Elle permet de construire deux
modèles d'une machine :
· Le modèle des besoins,
· Le modèle
d'architecture.
Le modèle des besoins est composé de diagrammes
de flots de données (DFD), des diagrammes de flots de contrôle
(DFC), des machines à états finis pour l'aspect temporel, des
spécifications de contrôle, des spécifications de
traitements et un dictionnaire des données.
Le modèle d'architecture a pour but d'attribuer les
différents éléments du modèle des besoins
(processus, spécifications de contrôles, données et
contrôles) à des unités matérielles et logicielles
qui composeront le système. Il intègre les éventuelles
contraintes technologiques. Il est constitué de diagrammes de flots
d'architecture, de spécifications de modules d'architecture, de
diagrammes d'interconnexion d'architecture et d'un dictionnaire d'architecture.
[5]
II-1-1- Diagramme de contexte de
données (DCD)
Ce diagramme est la représentation de la fonction
principale à laquelle on veut aboutir : la communication entre deux
ordinateurs.
Le DCD délimite le sujet de l'étude, et se
compose de bords, d'un processus, de flots de données. L'objectif du DCD
est d'exposer le but principal du système et identifier les
entités extérieures avec lesquelles il doit communiquer.
Dans un digramme de contexte, on trouve :
· Un seul processus représentant tout le
système sans aucun détail.
· Toutes les entités externes communiquant avec
le système (peuvent être de niveau élevé).
Dans notre application assurant la communication entre deux
ordinateurs, le diagramme de contexte de données est
représenté dans la figure II.1.
Afficher
Lire
Figure-II-1: Diagramme de contexte
II-1-2- Diagramme de fonctionnalités
C'est un diagramme décrivant les fonctionnalités
qui doivent être implantées par le système pour satisfaire
les besoins du client. Une fonctionnalité est immatérielle et
décrit une action prise par le système pour produire un
résultat. La sortie d'une fonctionnalité peut être
utilisée comme entrée par une ou plusieurs autres
fonctionnalités.
Dans un diagramme de fonctionnalités, on
trouve :
· Les fonctionnalités du système
représentées sous forme de verbe d'action suivi d'un nom.
· Les entrées pour chaque fonctionnalité.
· Les sorties pour chaque fonctionnalité.
II-1-2-1- Cas de la communication de deux PC avec le port
série RS232
D'abord, on doit effectuer la configuration du port RS232 afin
d'assurer la bonne transmission des données entre les deux ordinateurs.
Le port série peut effectuer l'envoi et encore la réception des
données. Pour cela, et afin de ne pas tomber dans des problèmes
d'encombrement, des tests vérifiant le mode de fonctionnement du port
(envoi ou réception) doivent être pris en compte. Si le port
série est prêt à la réception, l'adresse sera lue et
le caractère sera affiché. Si le port série est prêt
à l'envoi, le caractère sera transporté à travers
le port RS232.
L'organigramme relié à cette application est
donné par la figure II-2.
Non
Oui
Erreur ! Source du renvoi introuvable.
Figure-II-2: Organigramme du mode de fonctionnement du
RS232
II-1-2-2- Cas de la communication de deux PC avec le port
parallèle
Le port parallèle peut effectuer la transmission et encore
la réception des données.
Du coté émetteur, l'octet doit être
divisé en deux quartets pour être transféré. Donc le
récepteur charge les bits de faible poids (de 0 à 3) dans les
bits 0 à 3 du premier registre et met le cinquième (D4) à
0 pour que le récepteur reçoive la valeur 1 sur la ligne BUSY.
Du coté récepteur, le programme doit interroger
en permanence la ligne jusqu'à ce qu'elle monte à 1 pour transformer le contenu
de deuxième registre dans une variable. Ce contenu, ainsi lu, est
renvoyé à l'émetteur par les lignes de données. Le
bit de la ligne D4 est ensuite mis à 0 pour que l'émetteur trouve
sa ligne à 1. Ce dernier lit alors le quartet et peut la compare au
quartet envoyé. C'est une vérification au plus bas niveau.
Le même principe est répété pour la
transmission du second quartet de poids fort. Et il ne reste que la
concaténation de deux quartets pour obtenir l'octet. L'émetteur
relie le deuxième quartet renvoyé pour contrôle, le
concatène au second et teste s'il y a conformité avec l'original.
En cas d'erreur, une erreur est transmise au programme appelant afin de
décider ce qui est de mieux.
Il est clair d'après le mode de fonctionnement du port
parallèle effectuant la transmission d'un octet que il est
préférable de composer notre application en deux grandes
parties : la première se chargeant de l'émission et l'autre
pour la réception.
· L'organigramme assurant l'émission d'un octet
à travers le port parallèle est donné dans la figure
II-3
Oui
Non
Erreur ! Source du renvoi introuvable.
Figure-II-3: Organigramme du mode de fonctionnement du
port parallèle (émission)
· L'organigramme assurant la réception d'un octet
à travers le port parallèle est donné dans la figure
II-4
Oui
Erreur ! Source du renvoi introuvable.
Figure-II-4: Organigramme du fonctionnement du port
parallèle (réception)
III- Programmation
En informatique, la programmation modulaire repose sur
l'utilisation de
modules,
qui sont des structures permettant de définir des espaces regroupant des
éléments définis par le programmeur : fonctions,
structures de donnée, types, objets, etc.
Cette méthode de regroupement permet de réaliser
une
encapsulation
comparable par certains aspects à celle de la
programmation
objet, et permet l'organisation du code source en unités de
travail logiques. Les modules définissent également des
espaces
de noms utiles lors de leur utilisation.
La programmation modulaire n'induit pas obligatoirement un
style de
programmation
(ou
paradigme)
plutôt qu'un autre dans les éléments qu'elle structure qui
peuvent être de style
objet,
impératif
ou
fonctionnel.
Ce style de programmation facilite principalement la
réutilisation, le partage du code et est particulièrement utile
pour la réalisation de
bibliothèques.
De plus, suivant les
langages de
programmation, les modules peuvent être paramétrés
et/ou
polymorphes,
ce qui apporte une modularité dont la souplesse amène alors
à parler de
généricité.
La
programmation
générique est un sur ensemble qui peut tirer
avantageusement partie de la modularité apportée par la
programmation modulaire.
Afin d'assurer la communication entre deux ordinateurs, on est
amené à effectuer un programme par l'environnement Turbo C.
III- 1- Conception
L'étape de spécification a permis de
détecter les problèmes qui peuvent se poser lors de la
programmation. Le problème le plus important c'est de pouvoir suivre
l'état d'émission ou de réception d'un bit ou même
d'un octet suivant le type de port utilisé.
Après l'étape de spécification, on doit
décomposer notre programme en sous-programmes plus simples à
résoudre. Chaque sous-programme devient donc plus
élémentaire. Ce processus de «raffinement» se poursuit
jusqu'à arriver au niveau d'abstraction du langage de programmation que
l'on va utiliser (Turbo C). A ce niveau, on peut utiliser les
éléments du langage pour représenter le programme. [6]
III-1-1- Port série
· On doit tout d'abord effectuer la configuration du port
RS232 pour assurer la transmission des données entre les deux
ordinateurs. Cette étape est réalisée à l'aide
d'une fonction configurer décrite par son prototype void
configurer (void).
Cette fonction est donnée par :
void configurer (void)
{
outport(adr_base+3,0x80);
outport(adr_base,0x0c);
outport(adr_base+1,0x00);
outport(adr_base+3,0x03);
outport(adr_base+4,0x03); }
ü L'instruction
« outport(adr_base+3,0x80) » effectue la mise
à 1.
ü L'instruction « outport(adr_base+1,0x00
)» effectue la réglage de la vitesse de
transmission.
· Pour assurer l'envoi et la réception des
informations à travers ces deux ordinateurs dans des bonnes conditions,
on peut intervenir des fonctions test permettant de tester la présence
et le fonctionnement des matériels :
Tout d'abord, on peut tester la présence du clavier
à l'aide d'une fonction Unsigned char
test_clavier(void).
Cette fonction permet de tester la présence du clavier.
Unsigned char test_clavier (void )
{
if(kbhit()) return(1);
else return(0);
}
Cette fonction a recours à une fonction kbhit
déjà existante en Turbo C et qui permet de lire un
caractère tapé par le clavier.
On peut encore vérifier si le port est prêt à
la réception : on teste la présence du caractère dans
le port série. Cette étape est réalisée à
l'aide d'une fonction décrite par son prototype int test_
prêt _reception (void).
Cette fonction est donnée par :
int test_ prêt _reception (void)
{
unsigned char lu;
lu=inportb(adr_base+5);
lu=lu&1;
if(lu!=0) return(1);
else return(0);
}
Cette fonction a recours à une fonction
spécifique : inportb déjà existante dans la
bibliothèque de Turbo C. Elle permet de recevoir un octet dans un port.
Les périphériques ont généralement une plage de
ports qui lui sont adressés. Ces ports permettent de
« communiquer » avec ces périphériques.
ü L'instruction « lu=inportb(adr_base+5)
» permet la lecture du caractère dans le port
série.
ü «if(lu!=0) return(1)» : Cette instruction
permet de tester si le caractère lu à travers l'instruction
précédente est différent de 0. Ceci signifie que le port
RS232 est prêt à la réception.
On peut aussi vérifier si le port est prêt
à envoyer dans le but d'éviter l'encombrement entre
l'émission et la réception. Cette étape est
réalisée à l'aide d'une fonction
test_prêt_envoyer décrite par son prototype:
unsigned char test_prêt_envoyer(void)
Cette fonction est donnée par :
unsigned char test_prêt_envoyer(void)
{
unsigned char lu;
lu=inportb(adr_base+5);
lu=lu&0x20;
if(lu=!0) return(1);
else
{
return(0);
}
}
ü L'instruction
« lu=inportb(adr_base+5) », la même utilisée
dans la fonction précédente et permet la lecture du
caractère dans le port série.
ü «if(lu=!0) return(1)» : Cette
instruction est la même utilisée dans la fonction
précédente permet de tester si le caractère lu à
l'aide de l'instruction précédente est différent à
0, Ceci signifie que le port RS232 est prêt à l'envoi.
· Afin de visualiser le caractère qu'on vise
à envoyer, on peut utiliser une fonction qui permet la lecture d'un
caractère du clavier et, en cas de présence, l'affiche sur
l'écran du coté récepteur. Son prototype est de la
manière suivante : Unsigned char lecture
(void). Cette fonction a recours
à la fonction test_clavier déjà expliqué
auparavant.
Notre fonction est donnée par :
unsigned char lecture (void)
{
unsigned char lu;
lu=test_clavier();
if(lu==1)
{
lu=getch();
return(lu);
}
else return(0);
}
ü Cette fonction a recours à des fonctions
getch et return déjà existantes dans la
bibliothèque de Turbo C. « char getch
(void) » est une fonction permettant de lire un
caractère tapé par le clavier et l'afficher sur
l'écran.
· Du coté émetteur, un caractère
doit être affiché sur l'écran utilisant la fonction
précédente et encore mis dans le port RS232 afin d'être
envoyé à l'autre ordinateur. Cela est assuré grâce
à une fonction envoyer, décrite par son
prototype: void envoyer(void).
Cette fonction a recours à la fonction
test_prêt_envoyer déjà expliquée auparavant.
Cela permet de n'effectuer l'envoi d'un caractére que si le port est
prét à l'émission.
Cette fonction est donnée par :
void envoyer(void)
{
unsigned char lu,lu1;
lu=lect_clavier();
if(lu!=0)
lu1=test_ prêt _envoyer();
if(lu1=lu)
{
{
outportb(adr_base,lu);
if(lu==0x1b) sortie=1;
}
}
}
Cette fonction a recours à une fonction
spécifique : outportb déjà existante dans la
bibliothèque de Turbo C. Elle permet d'envoyer un octet dans un port.
Les périphériques ont généralement une plage de
ports qui lui sont adressés. Ces ports permettent de
« communiquer » avec ces périphériques.
ü L'instruction « outportb(adr_base,lu) est
utilisée pour le port série pour envoyer des données du PC
vers l'autre machine connectée.
· On peut assurer la réception et l'affichage du
caractère présent dans le port RS232, par une fonction
recevoir. Son prototype est de la manière
suivante : void recevoir(void) .
Cette fonction a recours à la fonction
test_prêt_reception déjà expliquée
auparavant.
Cela permet de n'effectuer la réception d'un
caractére que si le port est pêt à la reception.
Cette fonction est donnée par :
void recevoir(void)
{
unsigned char lu;
lu= test_prêt_reception();
if(lu!=0)
{
lu=inportb(adr_base);
if(lu==0x1b) sortie=1;
printf("%c",lu);
}
}
ü L'instruction « lu=inportb(adr_base)
» permet la lecture du caractère.
ü L'instruction « printf("%c",lu)
»permet l'affichage du caractère reçu.
Le programme complet est introduit dans l'annexe1.
III-1-2- port parallèle
D'après le diagramme de
fonctionnalité précédent du port
parallèle, notre programme est décomposé en deux grandes
parties: la première se chargeant de l'émission et l'autre pour
la réception.
· L'envoie est assuré grâce à une
fonction EnvoieOctet, décrite par son prototype:
int EnvoieOctet (unsigned char Valeur).
Du coté émetteur, on doit diviser l'octet en deux
quartets pour être transféré.
int EnvoieOctet (unsigned char Valeur)
{
unsigned char Retour;
outportb(PORT,Valeur&0x0F);
while(((inport(PORT+1)&0xF8)&128)==0);
Retour1 =((inport(PORT+1)&0xF8)>>3)&0x0F;
outportb(PORT,(Valeur>>4)|0x10);
Retour2=while(((inport(PORT+1)&0xF8)&128)!=0);
Retour = Retour1|Retour2;
(Valeur==Retour);
}
ü Cette fonction a recours à une fonction
spécifique, la même utilisée dans le port série.
C'est la fonction outport déjà existante dans la
bibliothèque de Turbo C. Elle permet d'envoyer un octet dans un port.
Les périphériques ont généralement une plage de
ports qui lui sont adressés. Ces ports permettent de
« communiquer » avec ces périphériques.
ü On déclare une constante PORT qui égale
à la valeur en hexadécimale 0x378.
ü L'instruction
« outportb(PORT,Valeur&0x0F)» permet l'envoi du quartet le
plus faible.
Afin d'expliquer «Valeur&0x0F »,
on prend par exemple valeur = 0101 0110.
Or 0x0F=0000 1111.
Alors,
Valeur & 0x0F=
0101 0110
0000 1111
0000 0110
Cela a
permis de prendre en compte seulement le
quartet le plus faible.
ü Afin d'atteindre la mise à zéro de BUSY,
on a recours à une boucle répétitive while
permettant ainsi de ne sortir de la boucle que si la condition sur BUSY
est vérifiée.
L'instruction
«while(((inport(PORT+1)&0xF8)&128)==0)»permet ainsi de tester
la condition sur BUSY.
La valeur est trouvée dans l'adresse de l'offset 1 (PORT+1).
Pour visualiser cette valeur, le procédé de
masquage est appliqué.
1 0 0 0
0 0 0 0 = (128)H
0 0 0
0 0 0 0
ü « Retour1
=((inport(PORT+1)&0xF8)>>3)&0x0F » :
Afin de vérifier la bonne transmission, l'acquisition
du quartet de retour à partir du récepteur est
effectuée.
Ce quartet de retour est initialement mis de la manière
suivante dans l'offset 1 du port parallèle (on désigne ce quartet
par la valeur abcd)
a
b
c
d
0
0
0
Cela mène à conclure qu'on doit effectuer un
décalage de 3 (>> 3) pour que le quartet de retour sera mis
dans les quatre premier bits de l'offset 1 tout en multipliant par la valeur
hexadécimale 0x0F pour le remplissage des autres valeurs, donc la valeur
retour 1 est donnée par :
0
0
0
a
b
c
d
0
ü
«outportb(PORT,(Valeur>>4)|0x10)» :
Afin d'envoyer le quartet le plus fort, on doit tout d'abord
le mettre dans les quatre premier bits en effectuant un décalage de
quatre et en écrasant ainsi le quartet le quartet faible( il est
déjà envoyé).
Cette valeur est additionnée par une valeur
hexadécimale (0x10) afin de remplir les autres quartets vides ( le but
de 1 est de positionner le quartet décalé).
ü Afin d'attendre la mise à 1 de BUSY, on a
utilisé la boucle répétitive while se basant sur
le même principe déjà expliqué auparavant.
ü
«Retour2=while(((inport(PORT+1)&0xF8)&128)!=0)» :
Le deuxième quartet de retour est initialement posé de la
manière suivante( on désigne ce quartet par la valeur
ABCD) :
A
B
C
D
0
0
0
Cela mène à conclure qu'on doit effectuer un
décalage à gauche de 1(<<1) tout en multipliant par 0xF0
afin de forcer les autres valeurs en 0, ainsi la valeur de Retour2 est
donnée par :
B
C
D
0
0
0
0
A
ü «Retour= Retour1|Retour2» : Cela permet
de concaténer les deux valeurs du quartet.
Ceci se fait de la manière suivante :
0
0
0
0
a
b
c
d
Retour1 :
0
A
B
C
D
0
0
0
Retour2 :
B
C
D
a
b
c
d
A
= Retour :
ü «Return (Valeur= = Retour)» : C'est
l'étape de la vérification.
Si Valeur est égale à Retour, on retour en 1
à la fonction EnvoieOctet, Sinon un message d'erreur doit
être affiché.
Le programme principal assurant l'émission est ainsi
décrit de la manière suivante:
void main(void)
unsigned char valeur;
clrscr();
do
{
valeur= getch(); // lire le caractère clavier
EnvoieOctet(valeur); // envoie du caractère
printf("%c",valeur); // affiche du caractère
même s'il est ESC
}while (valeur!=0x1b);//envoie de caractère si oui
sortir
}
Le programme complet est introduit dans l'annexe 2.
· La réception est assurée grâce
à une fonction RecOctet, décrite par son prototype:
unsigned char RecOctet( void ) définie de la
manière suivante
unsigned char RecOctet( void )
{
unsigned char LoNib, HiNib;
while((((inport(PORT+1)&0xF8)&128)==0));
LoNib =( (inport(PORT+1)&0xF8) >> 3) & 0x0F;
outportb(PORT,LoNib);
while((( (inport(PORT+1)&0xF8) & 128 ) != 0 ));
HiNib = ( (inport(PORT+1)&0xF8) << 1 ) & 0xF0;
outportb(PORT,((HiNib >> 4 ) | 0x10 ));
return( LoNib | HiNib );
}
ü On doit tout d'abord attendre la ligne jusqu'à atteindre la valeur 1. Cela est assuré
grâce à la boucle répétitive while :
while((((inport(PORT+1)&0xF8)&128)==0)) » :
La valeur est trouvée dans l'adresse de l'offset 1 (PORT+1).
Pour visualiser cette valeur, le procédé de
masquage est appliqué.
ü «LoNib = ((inport(PORT+1)&0xF8) >> 3)
& 0x0F»: Comme décrit dans la fonction
précédente, on doit décaler le quartet reçu
à droite par trois (>>3 ) afin de le placer dans les quatre
premiers quartets de l'offset du port parallèle.
ü Après la réception du quartet
supérieur, le port doit le renvoyer à l'émetteur qui le
compare au quartet envoyé. De cette façon, on a effectué
la vérification au plus bas niveau. Cela est assuré grâce
à la fonction : « outportb(PORT,LoNib ».
ü Afin d'attendre la mise à 1 de busy, on a
utilisé la boucle répétitive while par le
même principe déjà utilisé auparavant :
«while((( (inport(PORT+1)&0xF8) & 128 ) != 0 ))».
ü On répète le même principe pour la
transmission du second quartet de poids fort.
« outportb(PORT,((HiNib >> 4 )|0x10
))» : Afin d'envoyer le quartet le plus fort, on doit tout
d'abord le mettre dans les quatre premiers bits en effectuant un
décalage de quatre et en écrasant ainsi le quartet le quartet
faible.
ü «return(
LoNib|HiNib» :Après la réception des deux
quartets, on va retourner tout l'octet en effectuant la concaténation de
LoNib et HiNib.
Le programme principal assurant la réception est ainsi
décrit de la manière suivante:
void main(void)
{
unsigned char valrecu;
clrscr();
do
{
valrecu=RecOctet();
printf("%c",valrecu);
} while(valrecu!=0x1b);
}
Le programme complet est introduit dans l'annexe 2.
CONCLUSION
Grâce à cette méthode de
spécification et de programmation structurée, on a pu suivre
l'état d'émission et de réception d'un bit suivant le port
série RS232 et d'un octet suivant le port parallèle. Cette
méthode nous a permis d'éviter le problème d'encombrement
dans le port et le problème de blocage devant les contraintes
temporelles.
La dernière étape dans la programmation
structurée est le test et la validation. Cette étape a
été réalisé et a donnée des résultats
satisfaisants. Ceci montre la fiabilité et l'efficacité de notre
programme que ces soit pour le port série ou le port parallèle.
CONCLUSION GENERALE
L'élaboration de ce projet de fin d'études a
permis d'avoir une idée claire sur l'élaboration d'un programme
permettant d'effectuer la communication entre deux ordinateurs à travers
le port série ou le port parallèle.
Pour atteindre cet objectif, nous avons tout d'abord
présenté les différents outils de point de vue
matériel ou logiciel intervenant dans notre application.
On a ensuite recours à la programmation
structurée. Celle-ci est basée essentiellement sur des moyens de
spécification tels que le diagramme de flots de données dans
le modèle de SA-RT (diagramme de contexte de
données (DCD) ou encore le diagramme de
fonctionnalités). Cette étape de spécification nous a
donné une représentation abstraite et simplifiée du
fonctionnement de notre système.
Cela nous a facilité l'étape de
l'élaboration d'un programme fiable assurant la communication entre les
deux ordinateurs dans des bonnes conditions que ce soit à travers le
port série ou même le port parallèle. Un tel programme est
jugé fiable lorsqu'il permet d'éviter les problèmes
d'encombrement et de dépasser les contraintes temporelles.
Nos perspectives rentrent dans le cadre de
l'élaboration d'un nouveau programme permettant l'émission et la
réception de fichiers à travers le port parallèle. Ceci
sera encore basé sur la méthode de la programmation
structurée et on aura certainement recours à nos programmes
dèja élaborés dans ce mémoire.
Enfin, on est amené à confirmer que ce projet
nous a permis de nous investir totalement pendant quatre mois et d'approfondir
nos connaissances dans différents domaines tels que les méthodes
de spécification, les méthodes de conception et l'utilisation du
langage de programmation Turbo C.
BIBLIOGRAPHIE
[1] : « Mr Khaled
JELASSI » Fascicule de travaux pratiques : Bureau
d'étude Conception des systèmes temps réel et informatique
industrielle. Laboratoire d'informatique industrielle, ENIT, Edition 2004.
[2] : « » Fascicule
de travaux pratiques: Communication entre deux ordinateurs
Utilisant le port série. Laboratoire
d'informatique industrielle, ENIT
[3] : « Roger
D.HERSCH » Informatique Industrielle, Microprocesseurs et
interfaces temps réel, collection INFORMATIQUE, Presses polytechniques
et universitaires Romandes, 1997.
[4] : « » Fascicule de
travaux pratiques: Communication entre deux ordinateurs
Utilisant le port parallèle. Laboratoire
d'informatique industrielle, ENIT.
[5] : « Samir BEN
AHMED » Approche multi-modéles pour la
spécification, la validation et la conception de la commande des
systèmes flexibles de production manufacturière,
Thèse de doctorat d'état en informatique. Faculté de
Sciences de Tunis.
[6] : «BIBERSTEIN Olivier, QUELOZ
Pierre-Antoine et BRULHART Dominique» cours
Langage C, Janvier 1993.
·
www.wikipedia.org/wiki/Programmation_modulaire.fr
ANNEXE 1
#include<conio.h>
#include<stdio.h>
#include<dos.h>
Unsigned char lu;
Char sortie=0;
Static int adr_base=0x3F8;
/*************************Configuration
***************************/
void configurer(void)
{
outport(adr_base+3,0x80);
outport(adr_base,0x0c);
outport(adr_base+1,0x00);
outport(adr_base+3,0x03);
outport(adr_base+4,0x03);
}
/******************* Lecture d'un caractère du
clavier *********************/
unsigned char lecture (void)
{
unsigned char lu;
lu=test_clavier();
if(lu==1)
{
lu=getch();
return(lu);
}
else return(0);
}
/*********************** Teste du
clavier ***********************/
unsigned char test_clavier(void)
{
if(kbhit()) return(1);
else return(0);
}
/******************** Test réception du
caractère ***********************/
int test_prêt_reception (void)
{
unsigned char lu;
lu=inportb(adr_base+5);
lu=lu&1;
if(lu!=0) return(1);
else return(0);
}
/********************Tester l'envoi du
caractère***************************/
unsigned char test_prêt_envoyer(void)
{
unsigned char lu;
lu=inportb(adr_base+5);
lu=lu&0x20;
if(lu=!0) return(1);
else
{
return(0);
}
}
/*************** Envoyer le caractère au port RS
232 ***********************/
void
envoyer(void)
{
unsigned char lu,lu1;
lu=lect_clavier();
if(lu!=0)
lu1=test_pret_envoie();
if(lu1=lu)
{
{
outportb(adr_base,lu);
if(lu==0x1b) sortie=1;
}
}
}
/**********************main************************/
void recevoir(void)
{
unsigned char lu;
lu= test_reception();
if(lu!=0)
{
lu=inportb(adr_base);
if(lu==0x1b) sortie=1;
printf("%c",lu);
}
}
ANNEXE 2
/******Programme d'émission d'un
caractère sur le port parallèle*****/
#include<conio.h>
#include<stdio.h>
#include<dos.h>
#define PORT 0X378
/*****************Procédure de
transmission des caractères******************/
int EnvoieOctet (unsigned char Valeur)
unsigned char Retour;
outportb(PORT,Valeur&0x0F);
while(((inpportb(PORT+1)&0xF8)&128)==0);
Retour1 =((inportb(PORT+1)&0xF8)>>3)&0x0F;
outportb(PORT,(Valeur>>4)|0x10);
Retour2=while(((inportb(PORT+1)&0xF8)&128)!=0);
Retour = Retour1|Retour2;
(Valeur==Retour);
/**************************main
d'émission****************************/
void main(void)
unsigned char valeur;
clrscr();
do
{
valeur= getch();
EnvoieOctet(valeur);
printf("%c",valeur);
}while (valeur!=0x1b);
}
/****Programme de réception d'un
caractère sur le port parallèle*****/
#include<conio.h>
#include<stdio.h>
#include<dos.h>
#define PORT 0X378
/********************Procédure de
réception des caractères*****************/
unsigned char RecOctet( void )
{
unsigned char LoNib, HiNib;
while((((inport(PORT+1)&0xF8)&128)==0));
LoNib =( (inportb(PORT+1)&0xF8) >> 3 ) & 0x0F;
outportb(PORT,LoNib);
while((( (inportb(PORT+1)&0xF8) & 128 ) != 0 ));
HiNib = ( (inportb(PORT+1)&0xF8) << 1 ) & 0xF0;
outportb(PORT,((HiNib >> 4 ) | 0x10 ));
return( LoNib | HiNib );
}
/**************************main de
réception****************************/
void main(void)
{
unsigned char valrecu;
clrscr();
do
{
valrecu=RecOctet();
printf("%c",valrecu);
} while(valrecu!=0x1b);
}
|