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

Windows Discussion :

Port Série RS232 Overlapped


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Par défaut Port Série RS232 Overlapped
    Bonjour

    Je suis en stage dans une entreprise qui installe des systèmes de comptage (via camera ou capteurs de mouvement)

    Je dois développer un logiciel permettant de communiquer par le port série avec l'appareil qui effectue et stocke les comptages.

    Ca va faire 3 semaines que j'ai débuté le stage. J'ai pas mal avancé et également pas compris le fonctionnement mais je bute sur un problème.

    Actuellement je communique avec l'appareil via un Handle sur le port com qui va bien. Je fais des WriteFile, ReadFile en mode synchrone donc sans overlapped, mais une fonction de l'appareil permet de lui dire "compte et transmet moi un message à chaque entrée OU sortie". Quand j'effectue cette commande avec mon programme en mode synchrone, je dois faire un ReadFile (envoie d'un caractère sans importance pour forcer les ReadFile à chaque E/S)
    Ce qui n'est pas fort pratique. Donc j'aurais voulu utiliser le mode asynchrone.

    Or quand je fais un ReadFile() dans ce mode, RadFile me retourne VRAI, alors qu'il devrait retourner FAUX étant asynchrone. Windows n'est pas très clair sur le fait que parfois il peut se produire ce phénomène (fichier compressé par ntfs...)

    Si quelqu'un a eu un soucis tel que celui là et qu'il a trouvé une solution, ca serait sympas de me fournir quelques pistes. Pour vous permettre de visualiser mon code, je vous fourni ce morceau...

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    char* bufferTemp = new char[TAILLE_BUFFER];
        for(int i = 0; i < TAILLE_BUFFER; i++)
            bufferTemp[i] = '\0';
    
        unsigned long nbOctetsLus = 0;
        OVERLAPPED ov = {0};
        ov.Offset = 0;
        ov.OffsetHigh = 0;
        ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        COMSTAT	comStat;
        DWORD erreur;
        ClearCommError(hCom, &erreur, &comStat);
        DWORD nbOctetsALire = (comStat.cbInQue < TAILLE_BUFFER) ? comStat.cbInQue : TAILLE_BUFFER;
    
        if(nbOctetsALire == 0)
            return 0;
    
        BOOL success = ReadFile(hCom, bufferTemp, nbOctetsALire, &nbOctetsLus, &ov);
        cout << "nb d'octects lus : " << nbOctetsLus <<endl;
        if(!success)
        {
            //readfile a renvoyé false, on recupere l'error
            cout << "ReadFile operation is pending" << endl;
    
            if(GetLastError() == ERROR_IO_PENDING)
            {
                bool pending = true;
    
                while(pending)
                {
                    //l'erreur est celle qu'on attend (mode asynchrone)
                    BOOL bResult = GetOverlappedResult(hCom, &ov, &nbOctetsLus, TRUE);
    
                    if(!bResult)
                    {
                        if(GetLastError() == ERROR_IO_PENDING)
                            cout << "still pending :(" << endl;
                    }
                    else
                    {
                        cout << "read file completed" << endl;
                        pending = false;
                    }
                }
            }
            else
                cout << "pas d'erreur de pending..." << endl;
        }
    
        if(DEBUG && success)
            cout << "Nb d'octets lus : " << nbOctetsLus << endl;
    
        //ici nbOctetsLus à un sens
        bufferTemp[nbOctetsLus] = '\0';
        buffer.assign(bufferTemp);
    
        return nbOctetsLus;
    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Une piste:
    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
       
    SetLastError(0);
    /*BOOL success = */ReadFile(hCom, bufferTemp, nbOctetsALire, &nbOctetsLus, &ov);
        cout << "nb d'octects lus : " << nbOctetsLus <<endl;
        switch(GetLastError())
        {
        case ERROR_IO_PENDING:
    /* gestion du pending */
        break;
        case 0:
    /* gestion de la reception */
        break;
        default:
    /* gestion des erreurs */
        break;

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Par défaut
    GetLastError() ne retourne jamais ERROR_IO_PENDING...
    C'est uniquement le case 0 qui est sélectionné...

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    En faisant alors le test sur GetOverlappedResult?
    Autre point: utilisation de ReadFileEx (MS dit que c'est plutôt ça pour le mode asynchrone).

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Par défaut
    J'ai résolu mes problèmes grâce à une fonction threadée qui me permet de lire en continu sans bloquer mon interface Homme/Machine... Merci pour les quelques solutions proposées Je reviendrai ^^

Discussions similaires

  1. Flasher un BIOS à travers un port série RS232
    Par mbzhackers dans le forum Composants
    Réponses: 9
    Dernier message: 27/05/2008, 18h40
  2. port série RS232 virtuel pour C++
    Par Estelle.nugues dans le forum C++
    Réponses: 0
    Dernier message: 24/04/2008, 15h33
  3. Communication port série (RS232) avec VC++
    Par sanatou dans le forum Visual C++
    Réponses: 2
    Dernier message: 30/10/2006, 13h49
  4. Configuration Port Série (RS232)
    Par Bmagic dans le forum MFC
    Réponses: 2
    Dernier message: 07/07/2006, 10h18
  5. probleme port série rs232
    Par bob75018 dans le forum Langage
    Réponses: 1
    Dernier message: 30/01/2006, 17h20

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