1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
#include <stdio.h>
#include <dos.h>
#include <conio.h>
// Registres UART port COM2
#define ESC 0x1b
#define THR_RBR 0x2F8
#define IER 0x2F9
#define IIR 0x2FA
#define LCR 0x2FB
#define MCR 0x2FC
#define LSR 0x2FD
#define MSR 0x2FE
// Paramtres de la liaison
#define DONNE_7 0x02
#define DONNE_8 0x03
#define STOP_1 0x00
#define STOP_2 0x04
#define NONE 0x00
#define IMPAIRE 0x08
#define PAIRE 0x18
#define DLAB 0x80 // Accs au diviseur de frquence
#define RAZ_DLAB 0x7F
#define _600_BAUDS 192
#define _1200_BAUDS 96
#define _2400_BAUDS 48
#define _4800_BAUDS 24
#define _9600_BAUDS 12
/* -ed- curieux numero. Tu es sur ? J'aurais dit 8 + 3 = 11 (0x0B), PIC principal... */
#define INTR 0x23 // interruption interface srie numro 2
void interrupt ( *oldhandler)(void);
/* -ed- l'usage des globales est rarement justifie... */
unsigned char init_liaison;
unsigned char car_recu;
void interrupt handler(void)
{
/* -ed- je ne sais pas ce que tu cherches a faire ici,
mais on ne peut pas appeler puts() sous interruptions. */
puts("OK=OK=OK=OK=OK=OK");
}
/* -ed- main() retourne int. Toujours */
void main()
{
unsigned char car_lu;
clrscr();
/* Initialisation du port srie
7 bits de donnes, i bit de stop, parit paire, 9600 bauds.
*/
outportb(IER,0x01);
init_liaison = DONNE_7|STOP_1|PAIRE|DLAB; //DLAB positionn pour
//faire la slection
//de la vitesse de transmission.
outportb(LCR,init_liaison);
// Configuration de la vitesse 9600 bauds
outportb(THR_RBR,_9600_BAUDS);
//Puis, RAZ bit 7 du LCR
init_liaison &= RAZ_DLAB;
//Envoyer
nouveau la configuration au LCR avec le bit 7 (DLAB)
0
outportb(LCR,init_liaison);
/* -ed- Malheureux ! Il faut proteger cette section contre les interruptions */
disable();
/* sauvegarde l'ancien vecteur d'interruption */
oldhandler = getvect(INTR);
/* installe le nouveau gestionnaire d'interruption*/
setvect(INTR, handler);
/* -ed- fin de section protegee */
enable();
// Boucle dmission et de rception
do
{
car_lu = getch();
// Vrifier que le bit 5 du LSR, signifiant que le
// tampon d'mission est vide, est
1
/* -ed- alors polling ou interruption ? Il faut se decider... */
while(!(inportb(LSR)&0x20)); /* ce bit a un nom... */
// Emetre le caractre car_lu
outportb(THR_RBR,car_lu);
// Vrifier que le bit 0 du LSR, signifiant qu'un
// caractre est arriv, est
1
/* -ed- arrive ? Ah oui, tu veux dire 'recu'... */
while(!(inportb(LSR)&0x01)); /* ce bit a aussi un nom... */
car_recu = inportb(THR_RBR); // On vide aussi le tampon
/* -ed- Illogique. getch() / putch()... */
printf("%c",car_recu);
} while(car_lu !=ESC);
/* restaure l'ancien gestionnaire d'interruption */
setvect(INTR, oldhandler);
/* -ed- certes, mais pourquoi avoir installe une interuption si c'est pour ne pas s'en servir ? */
} |
Partager