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 :

Communication port série W2000/W98


Sujet :

MFC

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 20
    Points : 15
    Points
    15
    Par défaut Communication port série W2000/W98
    Salut

    Voila mon probleme: j'ai développé une appli en C++ avec Microsoft Development Environment 2003 Version 7.1.3088 (Visual .Net 2003 koi ) qui gère une communication avec une balance industrielle via le port série. Cette appli fonctionne correctement sous win 2000 et je reçois parfaitement la trame envoyée par la balance.
    Or, lorsque j'essaie la meme appli sous win 98, je ne récupère aucune information de la-dite balance. Apparemment, mon application ne retourne aucune erreur donc l'ouverture de la communication avec le port série est correcte et la réception pareil. J'ai vérifié les paramètres de configuration du port série grâce à l'hyperterminal, et lui, il récupere bien la trame envoyée.

    Je vous joins le codes de la fonction d'ouverture de communication :
    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
    27
    28
    29
    30
    31
    32
    e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits)
    {
        g_ErrCom = e_ErrCom_None;
     
        // On ouvre le port série
        g_hCom = CreateFile(strPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING,NULL);
     
        if(g_hCom == INVALID_HANDLE_VALUE)
        {
            // Echec
            g_ErrCom=e_ErrCom_Creation;
        }
        else
        {
            // On vide les buffers
            PurgeComm(g_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);      
     
            // On paramètre le port série
            g_DCB.DCBlength = sizeof(DCB);
            //Configuration actuelle
            GetCommState(g_hCom, &g_DCB);
            //Modification du DCB
            g_DCB.BaudRate=BaudRate;
            g_DCB.ByteSize=BitsSize;
            g_DCB.Parity=Parity;
            g_DCB.StopBits=StopBits;
            g_DCB.fDtrControl=DTR_CONTROL_DISABLE;
            //Configuration de la liaison serie
            SetCommState(g_hCom,&g_DCB);
        }
        return g_ErrCom;
    }
    Voici le code de ma fonction de réception :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    e_ErrCom ReceptionCom(void *lpBuf,unsigned int nCountMax, unsigned int* pCountRead)
    {
    COMSTAT Stat;
    DWORD Errors;
    unsigned int nCarALire;
    unsigned long NCarLus=0;
     
        if(g_hCom!=NULL)
        {
            //on pari sur pas d'erreur
            g_ErrCom=e_ErrCom_None;
     
            //Pour éviter de gérer un time out; Laisse le temps de recevoir la trame.
            Sleep(1000);
     
            //Pour connaitre le nombre d'octets dans le buffer d'entrée
            ClearCommError(g_hCom,&Errors,&Stat);
            nCarALire=Stat.cbInQue;
     
            //On effectue la lecture si il y a des caractères présents
            if( (nCarALire>0)&&(nCarALire<=nCountMax) )
            {
                if(ReadFile(g_hCom,lpBuf,nCarALire,&NCarLus,NULL)==0)
                {       
                    g_ErrCom=e_ErrCom_Reception;
                }
     
            }
            *pCountRead=NCarLus;
        }
        else
            //Le port n a pas été ouvert
            g_ErrCom=e_ErrCom_Creation;
     
        //Compte rendu de l'exécution
        return g_ErrCom;
     
    }
    Et enfin la fonction qui gère la fermeture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void FermeCom()
    {
        if(g_hCom!=NULL)
        {
            CloseHandle(g_hCom);
        }
    }
    Voila, ces fonctions sont-elles compatibles avec w98 ? comment pourrai-je les transformer pour que mon programme tourne sur cet OS ?

    J'ai cru comprendre que sous w98, on peut directement travailler avec les registres du port série, p-e est-ce cela la solution ?

    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
    Points : 17 323
    Points
    17 323
    Par défaut
    bonjour,
    je redis ce que j'ai dis a d'autres sur le meme sujet:
    Citation Envoyé par farscape
    bonsoir ,
    le sujet du port série est évoqué dans la faq vc .
    si tu es bloqué sur le ReadFile c'est que tu travailles en mode synchrone c'est a dire sans utilisé le flag FILE_FLAG_OVERLAPPED dans le createfile .
    Ce flag active le mode de communication asynchrone.
    je n'ai pas insisté sur ce point dans la faq ,(je compléterai le post)
    il ne faut pas travaillé en mode synchrone c'est ingérable .
    c'est le moyen le plus sur de perdre des caractères en réception ou de bloquer l'application.
    le mode asynchrone est beaucoup plus souple, les opérations sont placées en file d'attente par le système et traitées dés que possible.
    la gestion des fonctions WriteFile et ReadFile est un peu plus compliqué
    voir mon post pour les détails d'implementation.
    sous windows il faut travailler en mode Asynchrone uniquement .
    voir mon post dans le post it de la faq pour les détails d'implementations
    + le lien sur l'exemple.
    http://www.developpez.net/forums/vie...109812#1109812

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 20
    Points : 15
    Points
    15
    Par défaut merci
    Bah merci pour l'aide.

    Je vais essayer de travailler en asynchrone alors. Mais ça me paraissait tellement plus simple en synchrone

    @+

    Je marque résolu, et je me penche sur le pb

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    fascape le topic que tu cites au dessus
    http://www.developpez.net/forums/vie...109812#1109812

    n'existe plus, cela pourrait m'intéresser, y a t'il un moyen de le récupérer ?

  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
    Citation Envoyé par alexorel
    fascape le topic que tu cites au dessus
    http://www.developpez.net/forums/vie...109812#1109812

    n'existe plus, cela pourrait m'intéresser, y a t'il un moyen de le récupérer ?
    en fait le lien cité c'etait le pré-article qui a ete intégré ensuite dans la faq .
    il correspond donc au lien que je t'ai cité dans la faq..

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

Discussions similaires

  1. [VBA-E]communication port série
    Par Yolak dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 26/04/2007, 11h44
  2. Communication port série (RS232) avec VC++
    Par sanatou dans le forum Visual C++
    Réponses: 2
    Dernier message: 30/10/2006, 13h49
  3. Communication Port Série Internet
    Par psyckey dans le forum Hardware
    Réponses: 3
    Dernier message: 29/09/2006, 19h37
  4. [VB6] Probleme communication Port série
    Par Renard-fou dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 15/05/2006, 00h01
  5. probleme de communication port série
    Par ben23 dans le forum MFC
    Réponses: 8
    Dernier message: 06/02/2004, 15h12

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