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

Visual C++ Discussion :

problème de récupération de trame


Sujet :

Visual C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 67
    Par défaut problème de récupération de trame
    Coucou à tous.

    Voici la situation.

    je dois communiquer avec un matériel par une connexion RS232
    pour gérer la communication je me suis inspiré de la classe "SerialCom" situé
    http://c.developpez.com/faq/vc/?page...WithSerialPort.

    Lorsque l'on en voit une trame au matériel, celui ci envois une trame pour confirmer la réception.

    Mon problème est que je ne par vient pas à récupérer cette trame.


    Pourriez vous me dire ce qui ne va pas dans mon code SVP?

    CCom com;

    unsigned char *buffer;
    DWORD EvtMask =EV_BREAK ;

    com.PortOpen(1,19200,'N',8,1);
    com.UseRtsCts(false);
    com.UseDtrDsr(false);
    com.UseXonXoff(false);
    com.SetCommMask(EvtMask);
    com.PurgeCom();

    //initialise la bar de progress
    m_progress.SetRange(0,nombrefonction);
    m_progress.SetPos(0);

    //met tous les voyants en rouge
    for(int i=0; i<nombrefonction; i++)
    {
    voyant[i].SetBkColor(RGB(255,0,0));
    UpdateData(FALSE);

    }

    //pour chaque fontion
    for(i=0; i<nombrefonction; i++)
    {
    creerTrame(&nomcommande[i]);
    calculerPoidBits(trame[1]);

    com.WriteBuffer(trame);

    com.StartThread(com.m_pParent);
    AfxMessageBox(com.GetStringError());

    buffer = new unsigned char[100];
    com.ReadBuffer(buffer,sizeof(buffer));
    AfxMessageBox(com.GetStringError());

    //si la réponse est correcte mettre le voyant en vert
    if(buffer[0]==129)
    {
    voyant[i].SetBkColor(RGB(0,255,0));
    m_progress.SetPos(i+1);
    UpdateData(FALSE);
    RedrawWindow();
    }
    com.StopThread();
    }

    AfxMessageBox("test terminé");
    com.PortClose();

  2. #2
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Essaie d'initialiser les time out (SetCommTimeouts)

  3. #3
    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 ,
    ça ne risque pas de fonctionner, tu melanges les deux modes de fonctionnement, et tu appelles plusieurs fois la creation du thread de travail...
    que tu detruis plus bas.

    le premier exemple d'utilisation de la faq montre un usage sequentiel qui convient par exemple a l'utilisation d'une balance :
    inconvenient si la reception bloque le programme est bloqué.
    la deuxieme méthode est evenementielle et utilise un thread pour la reception des données.
    il faut deja savoir dans quel mode tu veux travailler.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 67
    Par défaut
    Ok merci pour les conseils
    Je travail en mode asynchrone,
    A l’origine je ne lancé pas de Thread.
    J’avais mis un time out et j’appelais la fonction « WaitCommEvent », mais cette dernière me retourné un message d’erreur.
    « fichier spécifier un trouvable »

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 67
    Par défaut
    Après avoir regarder les exemples de la faq, je suis revenu à ma programmation initiale, que j'ai expliqué précédemment.
    Malheureusement.

    J'ai une lecture incorrecte accuse de la fonction "WaitCommEvent"...
    Chose intéressante, c'est qu’avec le débogueur et malgré une erreur qui s'affiche, j'ai une lecture correcte de temps en temps

    Quelqu'un aurait une explication ou une petite idée à ma proposé SVP

  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
    tu peux montrer ton code ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 67
    Par défaut
    voici le demandé code:

    CCom com;
    CString reponse;
    unsigned char *buffer;
    DWORD EvtMask =EV_RXCHAR;

    com.PortOpen(1,19200,'N',8,1);
    com.UseRtsCts(false);
    com.UseDtrDsr(false);
    com.UseXonXoff(false);
    com.SetCommMask(EvtMask);
    com.PurgeCom();
    com.SetTimeouts(1000,1000);

    //initialise la bar de progress
    m_progress.SetRange(0,nombrefonction);
    m_progress.SetPos(0);

    //met tous les voyants en rouge
    for(int i=0; i<nombrefonction; i++)
    {
    voyant[i].SetBkColor(RGB(255,0,0));
    UpdateData(FALSE);

    }

    //pour chaque fontion
    for(i=0; i<nombrefonction; i++)
    {
    creerTrame(&nomcommande[i]);
    calculerPoidBits(trame[1]);

    com.WriteBuffer(trame);

    com.WaitCommEvent(EvtMask);

    long nr;
    buffer = new unsigned char [(nr=(com.SizeUsedInRXBuf()+1))];
    memset(buffer,0,nr);

    com.ReadBuffer(buffer,nr);

    //si la réponse est correcte mettre le voyant en vert
    if(buffer[0]==129)
    {
    voyant[i].SetBkColor(RGB(0,255,0));
    m_progress.SetPos(i+1);
    UpdateData(FALSE);

    }

    }

    AfxMessageBox("test terminé");
    com.PortClose();
    j'espère que vous pourrez dire ou je me suis planté...

  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
    salut,
    cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		com.WriteBuffer(trame);
    suppose que trame se termine par un \0 , c'est le cas ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 67
    Par défaut
    oui, j'ai mis un caractère de fin de chaine à ma trame.
    pourquoi?
    j'ai mon écriture sur le port fonctionne.
    C'est l'attente d'évenement et la lecture qui me pose problème...

  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
    hum ça me parait correcte,
    une remarque tu n'as pas de gestion de flux (même materiel) c'est normal ?
    les packets recus sont gros ?
    le cable est long ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 67
    Par défaut
    Non, je n'ai pas gestion de flux spécifique.
    D’un point vu perso, je trouve ça bizarre, mais l'ancienne version en basic fonctionne ainsi.
    les trames réception sont du même genre que les envois
    exemple "129 6 3 1 41 9"
    Quant à la longueur du câble environ 1 mètre.

  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
    aprés un essai rapide ,ce qui cause probleme c'est le fait de ne selectionner aucune gestion de flux .
    essaye de mettre :com.UseDtrDsr(true); ou RtsCts(true);
    il faut toujours une gestion de flux, au pire le cable doit etre strappé en consequence..


  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 67
    Par défaut
    j'ai mis "UseRtsCts(true)"
    rien à changer
    même avec différent évènemnt possible(EV_CTS, EV_RXCHAR...)
    en r'ajoutent "AfxMessageBox(com.GetStringError());" juste après "WaitCommEvent"
    j'ai toujour le même message "chemin spécifier introuvable"

  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
    Attention la lecture d'erreur doit être réalisée si waitcomEvent renvoie false...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(! 		com.WaitCommEvent(EvtMask))
    {
       AfxMessageBox(com.GetStringError());
    }
    EV_RXCHAR suffit pour SetCommMask.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 67
    Par défaut
    ok merci.
    mais le problème est toujours là.
    avant de quitter mon programme, je lui demande de afficher les trame qu'ils a lu.
    j'ai pus remarqué que le début des trames est correcte maintenant, mais la suite non
    exemple:
    pour l'envoi "129 6 3 1 41 9"
    à la reception"129 6 3 1 0 204" au lieu de "129 6 3 1 41 9"
    de plus il arrive que la première trame soit correcte

  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
    quand la reception fonctionne le pb n'est plus lié a la gestion de la voie série mais au reste du programme.
    es tu sur de ne pas te planter dans ton diagnostic ?
    un moyen simple c'est d'automatiser une séquence envoi /reception pour verifications en utilisant la macro TRACE par exemple en debug.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 67
    Par défaut
    je n'ai jamas utilise TRACE

    ça fonctionne comme un printf mais je fait comment pour le visualiser
    SVP

  18. #18
    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
    oui ça fonctionne comme printf .exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TRACE("\n emission %s",pbufferOut);
    TRACE("\n Reception %s",pBufferIn);
    l'affichage apparait dans l'onglet trace debug.

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 67
    Par défaut
    merci pour le TRACE
    pour tester mon programme je lui envois 3 trames
    129 6 3 1 41 9
    129 6 3 0 233 200
    129 6 3 0 41 9

    normalement il devrait me revoyer les même trames mais voici ce que de TRACE m'affiche:
    129 6 3 1 41 9
    129 6 3 0 204 204
    1 6 3 1 41 9

    je vais modifier le time out pour voir si c'est de la que vient mon problème

  20. #20
    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
    l'idéal serait de s'assurer qu'une gestion de flux materiel classique Rts/Cts soit possible.
    apres c'est une question de protocole d'envoi/reception.
    tu dis j'envois :
    129 6 3 1 41 9
    129 6 3 0 233 200
    129 6 3 0 41 9
    comment le recepteur sait qu'il peut commencer à renvoyer la réponse ?

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

Discussions similaires

  1. [TIBSQL] Problème de récupération d'un champs
    Par TitiFr dans le forum Bases de données
    Réponses: 6
    Dernier message: 07/08/2005, 13h33
  2. [hibernate]Problème de récupération d'objet...
    Par roxx62 dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/07/2005, 11h36
  3. Réponses: 8
    Dernier message: 12/05/2005, 08h16
  4. Nouveau problème de récupération de valeurs.
    Par pmboutteau dans le forum ASP
    Réponses: 4
    Dernier message: 09/03/2005, 10h48
  5. Problème de récupération de texte de formulaire
    Par bigourson dans le forum Langage
    Réponses: 4
    Dernier message: 15/09/2004, 16h27

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