FORUM Tom's Hardware » Programmation » C / C++ / Java » Probleme Port SERIE avec XON/XOFF
 

Probleme Port SERIE avec XON/XOFF

Il y a 402 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici



Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : Probleme Port SERIE avec XON/XOFF
 
Plus d'informations

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:
...
...

Code :
  1. void Init_Com1(void)
  2. {
  3. outb(0x80,LCR); /* DLAB=1*/
  4. outb(0x0c,DLLB); /* 9600 bauds */
  5. outb(0x00,DLHB);
  6. outb(0x1b,LCR);  /* DLAB=0  8bits de donnee, 1 bit de stop, parite paire*/
  7. }
  8. void Emet_car(char car)
  9. {
  10. /*sleep(1);*/
  11. while((inb(LSR)&0x40)!=0x40)
  12. {printf("Buffer transmission plein \n ";};
  13. if(inb(RXD)==0x13)                                        // XON/XOFF
  14.   {          while((inb(RXD))!=0x11);
  15.   }
  16. outb(car,TXD);
  17. }
  18. void Emet_chaine(char chaine[4])
  19. {
  20. char car_tempo;
  21. int i=0;
  22. while(i<4)
  23.   {      car_tempo=chaine[i];
  24.       Emet_car(car_tempo);
  25.       i++;
  26.   }
  27. }
  28. int main()
  29. {
  30. unsigned char val;
  31. char buffer[4]="bonj";
  32. char ecrit;
  33. /*Ouverture COM1*/
  34. val=ioperm(COM1,8,1);  // ouverture com1
  35. if (val)
  36. {
  37.   printf("\nErreur Ioperm = %d",val);
  38.   exit(1);
  39. }
  40. else {printf("\nPort Com1 ouvert=%d\n",val);}
  41.  
  42. Init_Com1();  // Initialisation Com1
  43.  
  44. printf("Ecriture ?\n" );
  45. scanf("%c",&ecrit);
  46. if (ecrit=='o')
  47. {
  48. Emet_chaine(buffer);
  49. }
  50. /* Fermeture Com1 */
  51. val=ioperm(COM1,8,0);
  52. if (val)
  53. {
  54.   printf("\nErreur Ioperm = %d",val);
  55.   exit(1);
  56. }
  57. else {printf("\nPort Com1 ferme=%d\n",val);}
  58.      
  59. }




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:

Code :
  1. void Init_Com2(void)
  2. {
  3. outb(0x80,LCR); /* DLAB=1*/
  4. outb(0x0c,DLLB); /* 9600 bauds */
  5. outb(0x00,DLHB);
  6. outb(0x1b,LCR);  /* DLAB=0  8bits de donnee, 1 bit de stop, parite paire*/
  7. }
  8. char Recep_car(void)
  9. {
  10. while((inb(LSR)&0x01)!=0x01) //Attente de donnée
  11. return (inb(RXD));
  12. }
  13. cahr *Recep_chaine(void)
  14. {
  15. char *ptr;
  16. ptr=(char *)malloc(sizeof(char));
  17. char i=0,j=0,recep_car;
  18. while(i<4)
  19.   {  recep_car=Recep_car();
  20.       *(ptr+j)=recep_car;
  21.       i++;j++;  }
  22. *(ptr+j)='\0';
  23. return (ptr);
  24. }
  25. int main()
  26. {
  27. unsigned char val;
  28. char *buffer;
  29. /*Ouverture COM2*/
  30. val=ioperm(COM2,8,1);  // ouverture com1
  31. if (val)
  32. {
  33.   printf("\nErreur Ioperm = %d",val);
  34.   exit(1);
  35. }
  36. else {printf("\nPort Com1 ouvert=%d\n",val);}
  37.  
  38. Init_Com2();  // Initialisation Com2
  39.  
  40. buffer=Recep_chaine();
  41. /* Fermeture Com2 */
  42. val=ioperm(COM2,8,0);
  43. if (val)
  44. {
  45.   printf("\nErreur Ioperm = %d",val);
  46.   exit(1);
  47. }
  48. else {printf("\nPort Com1 ferme=%d\n",val);}
  49.      
  50. }



Profil : Pointeur
Plus d'informations

et si tu jouais avec les semaphores ?


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
Plus d'informations

tu pense que mon XON/XOFF marcherait avec des semaphores?

Profil : Pointeur
Plus d'informations

non je pensais plutot utiliser les semaphore au lieu du xon/xoff


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
Plus d'informations

et tu fais comment avec les semaphore?
car je suis pas un tres fort en programmation

merci

Profil : Pointeur
Plus d'informations

alors la faut que je remette mon nez dans mes cours...

mais apparement puisque tu utilise 2 programmes, il te faut une semaphore nommée (accessible a tout l'os donc)


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
XHTML 1.1 certified

C'est bien gentil les semaphores (d'ailleur un mutex suffirait à mon avis) mais si la communication se fait entre 2 PC différents (j'imagine que c'est le but final de l'appli) ben ça marchera plus.

Je n'ai jamais vraiment fait de programmation avec les ports série mais j'imagine que le destinataire doit envoyer une info de synchro lorsque que l'info a été reçu et traitée, un peu comme les ACK du protocole TCP.
Reste à savoir si l'OS le fait directement (comme dans TCP) ou qu'il faut que ce soit fait par le programmeur (comme dans UDP)
Dans le dernier cas, il faut que ton programme connecté au port Com2 envoi le ACK dès qu'il a lu l'octet que le Com1 à envoyé.

Profil : Pointeur
Plus d'informations

effectivement si c'est sur 2 pc différents, adieu les semaphores :(

il faut effectivement etablir un protocol applicatif pour que le programme 2 indique au programme 1 qu'il a lu la donnée et qu'il attend la donnée suivante.


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
Plus d'informations

Il y a plusieurs erreurs dans le programme que je vois.
J'aimerais bien pouvoir voir les constantes...

Exemples du programme 1 (transmmission):

ligne 13: Je ne sais pas si tu as compilé, mais il manque une parenthèse:
printf("Buffer transmission plein \n ");

ligne 13: La logique qui est écrit fait en sorte que la chaîne "Buffer transmission plein \n " fload (remplie, bourre) . l'écran si le buffer est plein... Ce qui est désagréable.

Une façon plus conviviale serait:
printf("Buffer transmission plein...\n" );
while((inb(LSR)&0x40)!=0x40);
printf("Buffer transmission non contingenté.\n" );


ligne 13: {printf("Buffer transmission plein \n ";}; il y a un ; de trop.

ligne 15: Je crois que tu as oublié de faire un ET BINAIRE avec la lecture de RXD:
if( ( inb(RXD) & 0x13 ) ==0x13)

Même chose pour la ligne 16...

ligne 16: Même chose que la ligne 15: while((inb(RXD) & 0x11 )!=0x11);

Il y bcp d'autres erreur dans le programme, mais je crois qu'il est trop tard que je réponde à ce post presqu'un an plus tard ... Répond à ce poste si tu veux que je continu à dire les erreurs. De toute façon, même si je ne connais pas XON/XOFF, je crois que ton erreur est à la ligne 15 et 16...

Profil : Pointeur
Plus d'informations

enfin un up intelligent...


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
zeb
Profil : Modérateur libre

Re-up intelligent (prétencieux) pour celles ou ceux qui relirait ce post :
Utiliser les fichiers spéciaux /dev/ttySN et /dev/cuaN.


Aller à :
 
  FORUM Tom's Hardware » Programmation » C / C++ / Java » Probleme Port SERIE avec XON/XOFF

Annonces Google
Publicité
Actualités relatives

Nouveau firmware PS3 retiré

Publié le 03 July 2008

Heureux sont ceux qui n’ont pas encore téléchargé le firmware 2.40 de la PS3, ce dernier ayant causé toute une série de problèmes. Lire la suite

Samsung : des téléviseurs à rétro-éclairage LED pour bientôt

Publié le 13 July 2007

Samsung dévoile deux nouvelles gammes de téléviseurs LCD, les séries 71 et 81. La série 81 est la plus innovante puisqu’elle utilise un rétro-éclairage à LED sur des diagonales allant de 40 à 57". Grâce à ce système et au « local dimming » le t Lire la suite

Samsung : du Wi-Fi dans des plasmas Full HD

Publié le 13 July 2007

Samsung dévoile ses produits de la rentrée, parmi eux une série de téléviseurs plasmas de 50 et 58" intégrant une connexion Wi-Fi. Les plasmas série 94 sont des modèles Full HD qui intègrent une connexion Wi-Fi 802.11n, Samsung indique qu’ils peuvent rec Lire la suite

Canon PowerShot A650 IS : un problème et un rappel

Publié le 08 October 2007

Canon vient de lancer un rappel de certains appareils photo Powershot A650 IS. Ces appareils peuvent en effet manifester une coloration parasite de leur écran LCD lorsque celui-ci est mis en position inclinée, et éclairé directement par le soleil. Ce pro ... Lire la suite

Les derniers tests

Charts cartes graphiques Q3 2008 : 101 cartes testées

Publié le 29 September 2008

Les charts de 101 cartes graphiques anciennes et récentes sous 9 applications, avec au total 6767 scores. Quel gain attendre du remplacement de votre carte graphique par un nouveau modèle dans chaque application/résolution et en moyenne ? Lire la suite

Upgrader son portable en 9 leçons

Publié le 29 September 2008

Profiter au mieux de son PC portable en 9 leçons. Lire la suite

Que choisir ? Home Cinema 5.1 ou projecteur de son ?

Publié le 25 September 2008

Faut-il craquer pour un ensemble 5.1 ou pour une barre de son ? Découvrez les forces et faiblesses comparées de chaque système. Lire la suite

Intel Core i7 (Nehalem) : une architecture signée AMD ?

Publié le 25 September 2008

Avec ses nouveaux processeurs Core i7, Intel fait évoluer les Core 2 en reprenant leur architecture, mais en lui rajoutant des technologies dont la plupart semblent avoir leur équivalent direct chez AMD. Impression ou réalité ? Lire la suite