IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Actualisation du contenu d'un contrôle


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut Probléme de détection de DCD avec classe CCom
    Bonjour à tous,

    J'ai un petit soucis sur une actualisation du contenu d'un contrôle que cela soit un CEdit ou un CStatic.

    Je récupère une donnée sur mon port COM puis je l'affiche dans un CEdit.

    Fonction qui récupère la donnée sur le port COM:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    LONG CAppDlg::OnReceiveCom(WPARAM ch, LPARAM port)
    {
        char *szReceive;
        int nr;
        szReceive = new char [(nr=(m_Com.SizeUsedInRXBuf()+1))];
        memset(szReceive,0,nr);
        m_Com.ReadBuffer(szReceive,nr-1);
        CString str;
     
        str.Format("%s",szReceive);
        delete [] szReceive;
     
        m_dlg_Visu->SetData(str);
     
        return 0L;
    }
    Ma fonction SetData:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    bool CVisu::SetData(CString Data)
    {
         SetDlgItemText(IDC_EDT_DATA,Data.GetBuffer());
     
     
         return true;
    }
    Le truc c'est que ma data arrive en deux fois sur mon port ca veux dire que coup sur coup on passe dans la fonction OnReceiveCom(...), et donc que la fonction SetData est elle aussi appelée deux fois coup sur coup.

    j'arrive à afficher quelque chose si je met un temps d'arrêt (Sleep()) après SetData() dans la fonction OnReceiveCom(...)

    Quelqu'un pourrait il m'éclairer?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    un peu vague pour moi.
    quel est le problème rafraichissement trop rapide ?
    une donnée reçue a une taille prédéterminée ?
    note ce que tu as ecris peut etre amélioré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    LONG CAppDlg::OnReceiveCom(WPARAM ch, LPARAM port)
    {
        char *szReceive;
        int nr;
        szReceive = new char [(nr=(m_Com.SizeUsedInRXBuf()+1))];
        memset(szReceive,0,nr);
        m_Com.ReadBuffer(szReceive,nr-1);
        
        m_dlg_Visu->SetData(szReceive);
        delete [] szReceive;
        
        return 0L;
    }
    bool CVisu::SetData(const char *szData)
    {
         SetDlgItemText(IDC_EDT_DATA,szData);
            
         return true;
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    Salut Farscape,

    Le problème est que rien ne s'affiche, lorsque je met un Sleep() après ma fonction SetData() cela s'affiche sinon ca fait comme un clignotement et puis rien au final.

    Je vois bien que mon edit change de valeur(le clignotement) mais la valeur ne reste pas.

    En pas à pas cela s'affiche aussi donc je suppose que cela est du au temps d'actualisation,non?

    Merci encore

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    hé bien tout depend;
    si la deuxième réception est un blanc tu effaces tout d'où un effet de clignotement.
    il faudrait commencer par vérifier ce qui arrive en tant que flux.
    en trace debug par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bool CVisu::SetData(const char *szData)
    {
         TRACE("\ndata:(%s)",szData);
         SetDlgItemText(IDC_EDT_DATA,szData);
            
         return true;
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    Alors voilà j'ai fait ce que tu ma conseillé de faire : TRACE
    en effet avec ça on voit que la deuxième fois c'est du blanc...!!!

    alors qu'avec des points d'arrêt dans la fonction OnReceiveCom(...) on voit que la deuxième fois ce n'est pas blanc mais qu'il y'a bien des données!
    De plus avec les points d'arrêt les données s'affichent bien dans mon CEdit.

    Je ne pige pas vraiment...

    Ne serait ce pas un problème de retour chariot ou quelque chose dans le genre??

    Merci encore

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    tout est une question de gestion de flux ,de bufferisation de la communication etc..
    a partir du moment ou tu mets des points d'arrêts dans le programme le flux de donnée n'arrivera pas forcement de la même manière.
    d'où ma question précédente: un message a t-il une taille donnée prédéfinie ou non ?
    si ce n'est pas le cas il sera difficile d'affecter le résultat d'une communication
    a un edit...
    ou alors il faut attendre que le buffer de com soit vide entièrement vide avant d'envoyer les infos à l'edit..

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    Oui la trame à une longueur définie car c'est une trame type NMEA.

    Sinon, ce que je peux faire, vu que tous les champs ne m'intéressent pas, c'est un contrôle du type: Si je trouve les caractères suivant afficher dans le CEdit sinon ne rien faire.

    Pourquoi me demandes tu si la longueur de la trame est définie?
    Pour agrandir le buffer de reception à la valeur de la trame?

    Merci encore de ton aide Farscape

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Pourquoi me demandes tu si la longueur de la trame est définie?
    Pour agrandir le buffer de reception à la valeur de la trame?
    non ,
    pour mémoriser la réception dans un buffer jusqu'à la taille requise
    ensuite tu envoie celui-ci dans l'édit uniquement quand tu as tout reçu.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    J'ai une question à propos de cela justement, pourquoi recevoir une trame en deux fois alors que celle ci est bien envoyée en une seule fois?

    Merci

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    ça depend de beaucoup de choses...
    la vitesse de transfert ,le type d'uart utilisée ,le buffer windows alloué
    et enfin la taille du buffer envoyé.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    4800 Bauds et la trame NMEA comporte 68 caractères!!

    Je ne sais pas quoi faire, il faut absolument que je puisse récupérer toute la trame (les 68 caractères), afin que je puisse afficehr l'heure GPS; soit le deuxième champ de la trame.

    trame NMEA: $GPRMC,111236,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68

    je n'arrive à réccupérer que $GPRMC,1

    Une idée pour me débloquer?

    Merci d'avance

  12. #12
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    déjà il faut être sûr que les réglages de gestion flux soient correctes.
    gestion flux matériel : rts/cts -> câble adéquate.
    gestion flux soft: xon/xoff.

    pour 68 crts tu devrais pouvoir les lire en 1 seule fois...
    sinon tu peux aussi concaténer dans l'edit tant que sa taille n'est pas de 68 crts au lieu d'écraser le contenu.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    Salut,

    Je reviens à la charge, pour ce qui est de la trame, j'ai fait un contrôle dessus pour pouvoir l'interpreter correctement!

    Maintenant mon problème c'est toujours ce DCD.

    Est ce bien dans la fonction OnEventCom(WPARAM ch, LPARAM port) que je vais savoir si il a changé d'état ou pas ???

    car j'ai fait de la façon suivante juste pour controler si je le détectait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    OnEventCom(WPARAM ch, LPARAM port)
    {            
                 AfxMessageBox("un evenement sur le port COM");
    	//Si changement d'etat du LSD
    	if(port == EV_RLSD)
    	{	
    		AfxMessageBox("Detection Du DCD");
    		 //Le DCD a été activé
    	}
     
    return 0L;
    }
    Alors est ce que j'ai fait une erreur ou pas car la je ne détecte rien du tout?

    J'ai sans doute mal compris quelque chose!!

    Merci d'avance

  14. #14
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    le message est implémenté dans la macro BEGIN_MESSAGE_MAP ?

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    Salut,

    oui de la façon suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON_MESSAGE(WM_CCOMEVENT,OnEventCom)

  16. #16
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    si tu as déclaré correctement setcommask.
    il ne reste pas 36 solutions :
    soit l'évènement windows n'est pas le bon ,bien que ça ait quand même l'air de correspondre.
    soit ton câble n'est pas câblé pour le DCD pin: 1 si je me souviens bien pour un connecteur 9 broches.
    soit l'évènement n'est pas fourni...

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    OK je vais me renseigner j'ai trouvé un utilitaire sur le net pour voir l'état de toutes les pinouilles... je vais essayer pour voir si le DCD arrive bien .

    Merci encore Farscape

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    Salut,

    Je reviens à la charge avec mon DCD...!!!

    j'ai vérifier si le DCD était bien détecté sur mon port avec un utilitaire, et oui en effet il est détecté.

    donc j'ai modifié mon code et mis un mask comme tel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_Com.SetCommMask(EV_RLSD);
    et la ca fonctionne et je le détecte.

    mais dés que je met:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_Com.SetCommMask(EV_RXCHAR | EV_RLSD);
    rien à faire les caractère sont bien détecter mais pas mon DCD...??

    une idée peut être?

    note: j'ai bien fait la modif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if ((dwMaskEvent & EV_CTS) ||  // evenements divers.
                    (dwMaskEvent & EV_RXFLAG) ||
                    (dwMaskEvent & EV_BREAK) ||
                    (dwMaskEvent & EV_ERR) || 
                    (dwMaskEvent & EV_RING) ||
                    (dwMaskEvent & EV_RLSD))
                {
                    pCom->m_pParent->SendMessage(WM_CCOMEVENT,(WPARAM)pCom,dwMaskEvent);
     
                }
    et dans ma fonction OnReceiveEvent(...), je met:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        if(port==EV_RLSD)
       {
             AfxMessageBox("DCD passe au niveau haut");
       }
    Merci d'avance

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    Re,

    Petite info pour farscape:

    En vu des nombreux pbs que je rencontre (SetCommMask(EV_RXCHAR | EV_RLSD, Lecture en deux fois...), je me suis dit que j'avais fait surement une erreur quelque part dans mon code.

    Alors j'ai pris ton exemple sur la FAQ en modifiant juste le portnumber et le baudrate... et la surprise cela fait la même chose que moi, tu lis en deux fois un trame et lorsque je couple le EV_RXCHAR et le EV_RLSD et bien la détection du LSD (DCD) ne se fait pas non plus.

    Peut être as tu une idée??

    Merci encore de ton aide!

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    je pense avoir cibler le problème mais pas résolu; cela reste à confirmer!

    Ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if ((dwMaskEvent & EV_CTS) ||  // evenements divers.
                    (dwMaskEvent & EV_RXFLAG) ||
                    (dwMaskEvent & EV_BREAK) ||
                    (dwMaskEvent & EV_ERR) || 
                    (dwMaskEvent & EV_RING) ||
                    (dwMaskEvent & EV_RLSD))
                {
                    pCom->m_pParent->SendMessage(WM_CCOMEVENT,(WPARAM)pCom,dwMaskEvent);
     
                }
    peut importe l'évenement dans onReceiveEvent(...), port est toujours égale à ce que on met dans SetCommMask()

    Si EV_RXCHAR | EV_RLSD alors port = 21 si EV_RLSD = 20 si EV_RXCHAR = 1,
    ...

    Donc je vais essayer de me pencher la dessus.

    Kemanke

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment faire popur actualiser le contenu d'un div?
    Par Ministar dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 13/09/2007, 23h46
  2. Réponses: 1
    Dernier message: 16/08/2007, 09h43
  3. [WD10] [zone repetee] Actualiser le contenu
    Par Root_JDK dans le forum WinDev
    Réponses: 5
    Dernier message: 01/05/2007, 17h34
  4. Comment actualiser le contenu d'un répertoire
    Par nbelg27 dans le forum Access
    Réponses: 9
    Dernier message: 28/04/2006, 10h22
  5. actualiser le contenu d'une div
    Par Benjiijneb dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 08/02/2006, 10h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo