Progrmme Port SERIE XON/XOFF

Fermé
koros - 22 déc. 2004 à 10:44
 5wacha - 15 avril 2008 à 11:32
Bonjour,

Je veux pouvoir envoyer une chaine de caratcere (4) du port Com1 et la recevoir sur le port Com2 de mon pc (sous Linux red hat 9.0).
Mon probleme est que ca envoi la chaine de caractere mais je ne recois que le dernier caractere envoyé.
Cela est du au fait que si le port COM2 ne lit pas assez vite, la donnée sera ecrasé par la donnée suivante envoyé du COM1!
Donc j'ai voulu utiliser XON/OFF qui permet de regler se probleme en retardant l'émission de caractere pour ne pas ecraser le precedent sans qu'il soit lu.
Mais voilà il ne prends pas en compte le XON/XOFF que j'ai mis a l'interieur du programme suivant!

Si vous pouvez m'aider car là je suis vraiment embeter!

merci @+++
PS: je suis obligé de le faire avec ioperm...

Programme:
...
...
void Init_Com1(void) 
{ 
outb(0x80,LCR); /* DLAB=1*/ 
outb(0x0c,DLLB); /* 9600 bauds */ 
outb(0x00,DLHB); 
outb(0x1b,LCR);  /* DLAB=0  8bits de donnee, 1 bit de stop, parite paire*/ 
} 

void Emet_car(char car) 
{ 
/*sleep(1);*/ 
while((inb(LSR)&0x40)!=0x40) 
{printf("Buffer transmission plein \n ";}; 

if(inb(RXD)==0x13)                                         // XON/XOFF 
   {           while((inb(RXD))!=0x11); 
   } 
outb(car,TXD); 
} 

void Emet_chaine(char chaine[4]) 
{ 
char car_tempo; 
int i=0; 
while(i<4) 
   {       car_tempo=chaine[i]; 
      Emet_car(car_tempo); 
      i++; 
   } 
} 

int main() 
{ 
unsigned char val; 
char buffer[4]="bonj"; 
char ecrit; 

/*Ouverture COM1*/ 
val=ioperm(COM1,8,1);  // ouverture com1 

if (val) 
{ 
   printf("\nErreur Ioperm = %d",val); 
   exit(1); 
} 
else {printf("\nPort Com1 ouvert=%d\n",val);} 
  
Init_Com1();   // Initialisation Com1 
  
printf("Ecriture ?\n"); 
scanf("%c",&ecrit); 
if (ecrit=='o') 
{ 
Emet_chaine(buffer); 
} 

/* Fermeture Com1 */ 
val=ioperm(COM1,8,0); 
if (val) 
{ 
   printf("\nErreur Ioperm = %d",val); 
   exit(1); 
} 
else {printf("\nPort Com1 ferme=%d\n",val);} 
      
} 



Par contre si je mets le "SLEEP(1);" dans la fonction Emet_car() ca marche tres bien! mais je voudrai ne pas le mettre!
Si ca peux vous aider voici le programme qui lit la chaine de caractere sur le port COM2:

programme:

void Init_Com2(void) 
{ 
outb(0x80,LCR); /* DLAB=1*/ 
outb(0x0c,DLLB); /* 9600 bauds */ 
outb(0x00,DLHB); 
outb(0x1b,LCR);  /* DLAB=0  8bits de donnee, 1 bit de stop, parite paire*/ 
} 

char Recep_car(void) 
{ 
while((inb(LSR)&0x01)!=0x01) //Attente de donnée 
return (inb(RXD)); 
} 

cahr *Recep_chaine(void) 
{ 
char *ptr; 
ptr=(char *)malloc(sizeof(char)); 
char i=0,j=0,recep_car; 
while(i<4) 
   {  recep_car=Recep_car(); 
       *(ptr+j)=recep_car; 
       i++;j++;   } 
*(ptr+j)='\0'; 
return (ptr); 
} 

int main() 
{ 
unsigned char val; 
char *buffer; 

/*Ouverture COM2*/ 
val=ioperm(COM2,8,1);  // ouverture com1 

if (val) 
{ 
   printf("\nErreur Ioperm = %d",val); 
   exit(1); 
} 
else {printf("\nPort Com1 ouvert=%d\n",val);} 
  
Init_Com2();   // Initialisation Com2 
  
buffer=Recep_chaine(); 

/* Fermeture Com2 */ 
val=ioperm(COM2,8,0); 
if (val) 
{ 
   printf("\nErreur Ioperm = %d",val); 
   exit(1); 
} 
else {printf("\nPort Com1 ferme=%d\n",val);} 
      
} 

2 réponses

je serais moi par contre heureux de savoir comment fonctionne tout cela . J'aimerais pouvoir tt savoir sur les commandes AT, les chaines d'initialisations de modems, et evidemment la prog en utilisant les ports com , .... bref tout sur la partie fonctionnelle technique qui puissent me permettre de programmer là dessus

Merci
0
salut
je besoin d'un programme en mplab qui lit le octet arrivant de port RS232 et l'enrigestrer dans de case memoire qui vous defini l'adresse dés le debut.
0