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 :

[Classe CCom] Paramétrage du baudrate d'une liaison série


Sujet :

MFC

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Points : 65
    Points
    65
    Par défaut [Classe CCom] Paramétrage du baudrate d'une liaison série
    Bonjour à tous.
    J'utilise la classe de Farscape CCom.
    Initialement dans mon application, je configure le baudrate en 9600 par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CCom* m_pSerialPort; // dans le .h
    m_pSerialPort = new CCom();
    m_pSerialPort->PortOpen(1, 9600, 'N', 8, 0); //port n°, baudrate, parity, byte transfert, stop bit(s)
    Afin de changer de baudrate, j'utilise la méthode suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_pSerialPort->PortSet(19200, 'N', 8, 0); //baudrate, parity, byte transfert, stop bit(s)
    Cependant, je n'obtiens pas le résultat escompté. J'ai alors essayé de fermer le port puis de le rouvrir avec le nouveau paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m_pSerialPort->PortClose();
    m_pSerialPort->PortOpen(comPort, 19200, 'N', 8, 0); //port n°, baudrate, parity, byte transfert, stop bit(s)
    Cela ne marche toujours pas. Dès lors, je ne sais pas si c'est une erreur d'utilisation des méthodes ou si cela peut provenir de mon matériel. Me manquerait-il un paramétrage ?
    merci.

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    et si tu demarres direct à 19200 ça fonctionne ?
    d'ailleurs je ne comprends pas pourquoi tu demarres a 9600 puis a 19200 ..
    tu es sur que ton materiel est bien configuré ?

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Points : 65
    Points
    65
    Par défaut
    si je démarre direct à 19200, la liaison est quand même en 9600.
    Au niveau matériel, je pense que ça fonctionne.
    Si ça peut t'aider, je viens de remarquer le comportement suivant :
    1) je démarre l'appli sur le com 1 en 19200 -> réel 9600.
    2) je la ferme.
    3) j'utilise Serial Watcher (2.0.3) sur le com 1 en 19200 puis je ferme le port.
    4) je rouvre mon appli : ça marche en 19200.
    J'en déduis que le matériel fonctionne, mais aussi qu'il me manque quelque chose pour que mon paramétrage soit effectif.

    Au niveau configuration matériel, Windows m'indique 9600/8/Aucun/1/Aucun. Est ce que le fait d'ouvrir le port avec d'autres paramètres (19200/8/Aucun/1/Aucun) avec la classe CCom permet de changer ces paramètres ?

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Points : 65
    Points
    65
    Par défaut
    Quelqu'un saurait il ce que je ne fais pas dans mon code pour que le baudrate reste inchangé ?

  5. #5
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    hum c'est etrange .,
    que renvoi portOpen ? .
    une modif a apporter au a portset :
    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
    21
    22
    23
    24
    25
    26
     
    //-----------------------------------------
    bool CCom::PortSet(long baudrate,char parity,int wordlength,int stopbits )
    {   
        int result;
     
        if(!m_hCom) return false;
     
        m_baudrate=baudrate;
        m_parity=parity;
        m_wordlength=wordlength;
        m_stopbits=stopbits;
     
        char *szBaud = new char[50];
        sprintf(szBaud, "baud=%d parity=%c data=%d stop=%d", baudrate,parity,wordlength,stopbits);
        if (result=GetCommState(m_hCom,&m_dcb))
        {
            m_dcb.fRtsControl = RTS_CONTROL_ENABLE;
            result=-1; // rajout 
            if (BuildCommDCB(szBaud, &m_dcb)) result=SetCommState(m_hCom, &m_dcb);   
        }
        if ( result < 0 )  GetError();
        delete szBaud;	
        PurgeCom();
        return( (result >0) );
    }
    je ne vois pas de raison pour que le port reste a 9600 ,si portSet Revoie true. et donc PortOpen .

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Points : 65
    Points
    65
    Par défaut
    Avant de modifier la méthode PortSet, portOpen renvoie 1.
    Après modification, portOpen renvoie 0.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        if (result=GetCommState(m_hCom,&m_dcb)) 
        { 
            m_dcb.fRtsControl = RTS_CONTROL_ENABLE; 
            result=-1; // rajout 
            if (BuildCommDCB(szBaud, &m_dcb)) result=SetCommState(m_hCom, &m_dcb);    
        } 
        if ( result < 0 )  GetError();
    Dans le premier 'if', 'result' vaut 1. Cependant, avec la modif, on rentre dans le GetError() (du au rajout). Dans cette méthode, j'observe :
    m_StrError = {"Paramètre Incorrect."}
    Mais en fait, je ne vois pas ce qu'apporte cet ajout, a part vouloir obtenir un message d'erreur .

    De toute manière, le résultat est identique, le port reste à 9600.

  7. #7
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    Ça veut bien dire que ton paramétrage est incorrect
    Met 1 a la place de zéro dans le bit de stop .
    Exemple de chaîne construite :
    PorSet:baud=57600 parity=N data=8 stop=1
    les valeurs corrects pour le bit de stop 1,1.5,2 par defaut c'st 1

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Points : 65
    Points
    65
    Par défaut
    les valeurs corrects pour le bit de stop 1,1.5,2 par defaut c'st 1
    Effectivement, grosse boulette de ma part... Directement ça marche mieux maintenant !
    à toi Farscape.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/04/2009, 19h49
  2. Réponses: 1
    Dernier message: 26/04/2007, 15h23
  3. Comment capturer les données sur une liaison série RS232
    Par jef Orome dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 02/04/2007, 18h14
  4. Réponses: 4
    Dernier message: 30/03/2007, 16h27
  5. Insertion d'E/S TOR dans une liaison série
    Par t0t0 dans le forum Composants
    Réponses: 5
    Dernier message: 06/08/2006, 08h43

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