Rafraichir des données

Signaler
Messages postés
4
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
9 juin 2008
-
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
-
Bonjour,

Je dois réaliser un logiciel permettant de récupérer et d'afficher des données provenant d'une communication RS232.
Je récupère correctement ces données, et les affiche aussi de la bonne façon.

MAIS je suis encore incapable de rafraichir le buffer contenant les données et incapable aussi de les afficher au rythme des transmissions.

Pour l'instant j'effectue un updateallview(0,0) dans ma fonction de lecture du port COM, mais cela ne fonctionne pas correctement ....

Si quelq'un pouvait m'expliquer comment effectuer un rafraichissement de données ainsi que le rafraichissement de la vue

Merci d'avance.....

5 réponses

Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bonjour,

On ne maîtrise pas l'arrivée des données sur le port RS232 donc il faut un programme qui soit en permanence à l'écoute de ce port. Dans votre programme il faut donc créer un thread qui ne fait que la lecture du port RS232 et qui place ce qu'il reçoit dans le buffer (qui est une file d'attente). Quant à la partie "visualisation", au lieu de lire le port RS232, elle lit le buffer : tant qu'il y a quelque chose dans la file d'attente, on traite et on visualise. Les 2 actions sont ainsi désynchronisées et fonctionnent à leur propre rythme. A priori la précaution principale à prendre est de ne pas saturer la file d'attente.

Jean-François
Messages postés
4
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
9 juin 2008

Merci, mais justement comment j'effectue cette lecture en permanance de ce port??
Parce que moi, mas fonction de lecture s'effectue de la facon suivante :

J'appuis sur le bouton CONNECT, puis j'appelle la fonction d'ouverture du port COM, et une fois le port COM ouvert, j'appelle la fonction de lecture du port COM, et une fois ensuite, à l'aide d'une boite de dialogue, j'appelle la fonction d'affichage.

et justement mon problème est que je ne sais pas comment dire à ma fonction de lecture du port COM de s'effectuer tout le temps.. je remplis bien un buffer sous forme de file d'attente, mais cela se stoppe lorsque je l'affiche .....

qu'est ce qu'un THREAD?

voici ma fonction de lecture :

BYTE* CBCMDoc::PortRead()
{
 //Initialisation des variables
 BYTE *BufferIn;
 COMSTAT EtatCom;
 DWORD CodeErreur ;
 DWORD NbOctetsALire;


 CString Chaine;
 Chaine.Format(" Appuyer sur ENTER pour commencer");
 AfxMessageBox(Chaine);




 if (!ClearCommError(hFile,&CodeErreur,&EtatCom))
 {
      // Handle the error.
  CString Chaine;
  Chaine.Format(" ClearCommError failed with error %d", GetLastError());
  AfxMessageBox(Chaine);
  return FALSE;
 }    // Si rien, alors pas de  périphérique.
 else         // Si présence port, alors définir :
 {
  NbOctetsALire = EtatCom.cbInQue;
 }




 //--------- Lecture de tous les octets reçus et stockage dans le tableau BufferIn---
 BufferIn=new BYTE[NbOctetsALire];
 // Allocation dynamique


 if (!ReadFile(hFile , BufferIn , NbOctetsALire , &NbOctetsLus , NULL))
 {
  CString Chaine;
  Chaine.Format(" Could not read to file (error %d)", GetLastError());
  AfxMessageBox(Chaine);
        return FALSE;
    }


// UpdateAllViews(NULL);
 //Retour du buffer contenant toutes les données transmises par le port
 return BufferIn;
}
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Un "thread" (fil en français) est un programme (assez court en général) qui va être exécuté indépendemment du programme principal qui l'a lancé via la fonction CreateThread(). Au vu de vos explications, je dirais que l'appui sur le bouton CONNECT va lancé ce thread qui contient les instructions d'ouverture de la connexion suivit de la boucle de lecture du port/écriture dans la file d'attente. La fonction d'affichage lira et traitera cette file d'attente.

Jean-François
Messages postés
4
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
9 juin 2008

Merci pour la réponse, je vais m'orienter sur cette voie de THREAD.
En effet, une fois que je suis connecté à mon port COM, j'ai besoin de tout le temps utiliser la fonction de lecture de ce port.

Une fois, ce thread lancé, il faut utiliser différentes instructions spécifiques pour actualiser ou cela se fait-il tout seul???

MERCI
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Une fois le thread lancé il vit sa propre vie !

Voir ce post avec des exemples de thread (sous console mais le principe est le même) : http://www.cppfrance.com/infomsg_THREAD_1121058.aspx

Jean-François