lsdYoYo gravity powered | barucca a écrit :
ben justement si j'ai bien compris les interruptions c'est pour pas utiliser de thread car le module de reception est sous DOS, non??
|
En fait, tu as 2 problèmes !
- Il est *obligatoire* de traiter l'interruption déclenchée lors de chaque réception de caractère (COM1 : IRQ 4 - Int 0x0C / COM2 : IRQ 3 - Int 0x0B). Les fonctions offertes par l'Int 0x14 sont inutilisables en pratique. Ceci compris, soit tu écris toi-même la routine de traitement de l'interruption, soit tu recherches une bibliothèque de fonction.
- Le traitement de l'interruption n'est pas suffisant ! Lorsque le CPU sous DOS se trouve en traitement d'interruption, il faut faire très attention à ce que l'on fait. Beaucoup de traitements sont interdits sous peine de planter le PC (ou bien la machine virtuelle DOS de Windows). Sous interruption on se contente généralement de stocker les caractères reçus dans un buffer (fifo) pour le traitement par la boucle principale du programme.
En (très) simplifié, le programme ressemblerait à ça :
Code :
- .../...
- #include "serial.h" //Header de la bibliothèque
- .../...
- void main(void)
- {
- SERIAL Handle;
- char buff[81];
- int nbr;
- Handle = ComOpen(1, 9600, 8, 'S', 1); //(1)
- while(1) //(2)
- {
- nbr = ComRead(Handle, buf, sizeof(buf) -1); //(3)
- traite_com(buf, nbr);
- .../...
- if(xxxx) //(4)
- ComWrite(buf, nbr);
- .../...
- autres_taches(); //(5)
- }
- }
|
Les noms "serial.h, SERIAL, ComOpen(), ...etc." sont fictifs. Je ne sais pas comment ils s'appelleront dans la bibliothèque que tu aura trouvée en finale (soyons optimistes !).
L'exemple montre que :
(1) On initialise le port série. Cette fonction installe un gestionnaire pour les interruptions
(2) Boucle principale du soft (quelque part, il faudra un "break" ou un "exit()" )
(3) A chaque passage dans la boucle, on vérifie si des caractères sont en attente (mémorisés par le gestionnaire d'interrupt)
(4) Sur une condition de ton soft, tu émets des caractères (buf et nbr à affecter dans ton soft)
(5) Les autres tâches de ton soft sont exécutées ici.
N.B : Les autres taches ne doivent jamais garder le contrôle trop longtemps sinon le buffer interne de réception des caractères risque de déborder !
En conclusion, écrire "à la main" un gestionnaire d'interrupt est assez balaise (l'adresse donnée par Ace17 en donne une idée) et je recommande de chercher des fonctions déjà écrites.
Qqu'un sait où en trouver ?
---------------
If I want to fail and succeed, which I have done ?
|