begin process at 2012 05 28 20:39:46
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Systeme

 > 

Déroutement d'interruption sous DOS


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Déroutement d'interruption sous DOS

jeudi 1 décembre 2005 à 10:18:03 | Déroutement d'interruption sous DOS

cmadianga



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)//donn‚e 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();
}



Cette discussion est classée dans : int, ini, com1, rx, tx


Répondre à ce message

Sujets en rapport avec ce message

RS232 vitesse differente RX TX [ par bobnono ] Bonjour tout le monde, est-ce possible d'avoir une connexion série rs232 ou la reception est à 32120 bauds et l'émission &#2 RX & TX [ par ChOcOs ] il y a t-il une commande pour connaître le nombre de bytes entrés et sortis (RX et TX) de ma connection internet (ADSL) Si oui laquelle ?Merci d'avanc Pas compris les arguments [ par Bog ] Bonjour.Voila à chaque fois que je me lance dans un projet de programmation C++, je suis tjrs bloqué par certaines choses, surtout les arguments, et c Pas compris les arguments [ par Bog ] Bonjour.Voila à chaque fois que je me lance dans un projet de programmation C++, je suis tjrs bloqué par certaines choses, surtout les arguments, et c int 21h [ par GEDEON ] Salut, j'aurais besoin d'aide pour appeler une interruption assembleur sousVisual C++......Tout mon code fonctionne sauf la ligne "int 21h"... Là j'ai Conversion int -> char * [ par Xentor ] Bonjour tout le monde, et merci de lire mon message parce que je suis un vrai débutant !Je voudrais savoir comment convertir un entier en tableau de c Probleme sur une methode [ par kild ] Bonjourje desire crée un exe ki execute via le choix de l'utilisateur un autre executable dont g po les sources et ki utilise des commandes en ligne d ERREURS incompréhensibles ? au secours ......!!! [ par nicoy2000 ] xlC *.C affiche.C:fond.C:sapin.C:sol.C:triangleJD.C:triangleJG.C:ld: 0711-224 WARNING: Duplicate symbol: .triangleJG(int,int,char(*)[5],int,int)ld: Exporter une classe dans une DLL... [ par Clovis ] Salut,Je voudrais pouvoir exporter dans une DLL, si c'est possible, les fonctions et les objets du listing suivant. Car, je voudrais, par la suite pou Dans le genre prenant........ [ par Xs ] oui !c 'est trés chiant !j'explique mon pb : j'ai un code source, fais par moi-meme, et dedans, je veux que l'on saisisse des renseignement comme le l


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,796 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales