Bonjour à tous
Je dois réaliser une application qui gère une communication série avec une liaison série RS232 par interruption sous DOS. Pour cela j'utilise le port COM1 et la ligne d'interruption IRQ4. J'ai modifié la routine d'interruption mais lorsque que l'UART génère l'interruption IRQ4 il ne renttre jamais dans la nouvelle routine.
Je programme avec Turbo C de Borland
Voici le code
Merci d'avance pour votre aide
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <dos.h>
#define PIC1 0x20
#define PIC2 0xA0
#define COM1 0x3F8
#define INT0 0x78 //interruption logicielle pour l'envoi de données
#define INT1 0x79 //interruption logicielle pour la réception de données
#define INT_COM1 0x0C
#define MAX 512
char Buffer_Tx[MAX];
char Buffer_Rx[MAX];
int Tx;
int Tx_ini;
int Rx;
int Rx_ini;
void Init_RS232(int vitesse/*,int nbdata,int parite,int nbstop*/)
{
unsigned char LSB,MSB,LCR;
unsigned short int diviseur ;//16 bits
outportb(COM1+3,0x80); //DLAB=1
//configuration vitesse
diviseur = 1843200/(vitesse*16);
printf("diviseur = %X \n",diviseur);
//LSB = diviseur & 0x00FF;
//MSB = (diviseur & 0xFF00)/256;
LSB = 0x0C;
MSB = 0x00;
printf("LSB = %X \n MSB = %X \n",LSB,MSB);
outportb(COM1,LSB);
outportb(COM1+1,MSB);
//config nbdata,parite,nbstop
LCR = 0x00; //DLAB = 0 mode utilisation
//LCR = nbdata + nbstop*4 + parite/8 + 64;
LCR = 0x03;
printf("LCR = %X \n",LCR);
outportb(COM1+3,LCR);
outportb(COM1+2,0xC7);
outportb(COM1+4,0x0B);
//config des interruptions
outportb(COM1+1,0x03);//registre transmission et reception
}
void Envoyer_caractere(char c)
{
/*unsigned char LSR;
LSR = inportb(COM1+5);
while(LSR & 0x20 != 0x20)
{
LSR = inportb(COM1+5);
}*/
outportb(COM1,c);
}
char Recevoir_caractere()
{
char c;
/*unsigned char LSR;
LSR = inportb(COM1+5);
while(LSR & 0x01 != 0x01)
{
LSR = inportb(COM1+5);
}*/
c= inportb(COM1);
return c;
}
void interrupt IRQ_ISR()
{
disable();
printf("IRQ4 fonctionne \n");
if(testSource_IRQ()==1)//donnee recue
geninterrupt(INT1);
else if(testSource_IRQ() == 0)//regostre transmission vide
geninterrupt(INT0);
outportb(PIC1,0x20);//fin d'IT
enable();
}
void interrupt Rx_ISR()
{ Buffer_Rx[Rx++] = Recevoir_caractere();
if(Rx>MAX-1)
Rx = 0;
}
void interrupt Tx_ISR()
{ if(Tx_ini != Tx)
{
Envoyer_caractere(Buffer_Tx[Tx_ini]);
Tx_ini++;
}
if(Tx_ini > MAX -1)
Tx_ini = 0;
}
int testSource_IRQ()
{
int retour;
unsigned char LSR;
LSR = inportb(COM1+5);
if(LSR & 0x01 == 0x01)//donne recue
retour = 1;
else if(LSR & 0x20 == 0x20)//registre de transmission vide
retour = 0;
return retour;
}
void main()
{
char c;
int i;
void interrupt ( *old_isr_IRQ)();
void interrupt ( *old_isr_Tx)();
void interrupt ( *old_isr_Rx)();
Tx = Tx_ini = Rx =Rx_ini = 0;
//Init_RS232(9600);
disable();
old_isr_IRQ = getvect(COM1);
setvect(INT_COM1,IRQ_ISR);
old_isr_Tx = getvect(INT0);
setvect(INT0,Tx_ISR);
old_isr_Rx = getvect(INT1);
setvect(INT1,Rx_ISR);
Init_RS232(9600);
printf("config OK \n");
enable();
i = 0;
do
{
c = getch();
if(i == 0)
{
Envoyer_caractere(c);
i++;
printf("envoi 1er caract Ok\n");
}
else
{
Buffer_Tx[Tx++] = c;
printf("suite d'envoi avec Tx = %i et Tx_ini = %i \n",Tx,Tx_ini);
if(Tx > MAX - 1)
Tx = 0;
while(Rx != Rx_ini)
{
printf("%c",Buffer_Rx[Rx_ini++]);
if(Rx_ini > MAX -1)
Rx_ini = 0;
}
}
}while(c!=0x1B);//touche ECHAP
disable();
setvect(INT_COM1,old_isr_IRQ);
setvect(INT0,old_isr_Tx);
setvect(INT1,old_isr_Rx);
enable();
getch();
}