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 :

[APIwin32-waitcommevent] Problème avec l'event


Sujet :

Windows

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Par défaut [APIwin32-waitcommevent] Problème avec l'event
    Salut à tous


    Voilà je bosse sur le port série en api win32 et je doit , avec ma liaison asynchrone aller lire des caractère dès qu'ils sont reçus sur le port série.

    j'ai donc ecrit ce code

    Code c++ : 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
    //---------------------------------------------------------------------------
    #include <windows.h>
    #include <assert.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <stdio.h>
    #include <vcl.h>
    #pragma hdrstop
     
    //---------------------------------------------------------------------------
     
    #pragma argsused
    int main(int argc, char* argv[])
    {
            OVERLAPPED over;
            HANDLE hComm;
            DWORD EventMask;
            hComm = CreateFile("COM1",GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
            if (hComm == INVALID_HANDLE_VALUE){
                    printf("Erreur d'ouverture de port");
            } else {
                    if (SetCommMask(hComm,EV_RXCHAR)){
                            over.hEvent = CreateEvent(
                                    NULL,
                                    TRUE,
                                    FALSE,
                                    NULL);
                            over.Internal=0;
                            over.InternalHigh=0;
                            over.Offset=0;
                            over.OffsetHigh=0;
                            assert(over.hEvent);
                            while (true){
                                    if (WaitCommEvent(hComm,&EventMask,&over)){
                                            if (EventMask & EV_RXCHAR){
                                                    printf("caractère reçus");
                                                    getch();
                                            }
                                    }
                                    else {
                                            printf("Error %d",GetLastError());
                                            getch();
                                    }
                            }
                    } else {
                            printf("erreur creation event %d",GetLastError());
                    }
            }       getch();
            return 0;
    }
    //---------------------------------------------------------------------------

    Hors j'ai un gros problème, le waitcommevent me renvoit toujours 0, donc avec le getlast error j'ai regarder un peut ce que j'avai et si je le prend comme dans ma boucle j'ai quelque chose comme

    Erreur 997 ERROR_IO_PENDING
    Erreur 87 ERROR_INVALID_PARAMETER
    Erreur 87
    Erreur 87
    Erreur 87
    ...
    Erreur 87
    (j'envoi un caractère depuis l'autre poste)
    Erreur 997
    Erreur 87
    Erreur 87
    Erreur 87
    ...

    Donc voilà ça fait déjà un bon moment que j'ecume les forums et les faqs mais je ne trouve rien

    Si vous avez une idée de génie je suis preneur :p

    (au cas ou j'ai test la liaison avec 2 hyperterminal sans problème)

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Tu dois peut-être refaire ta structure OVERLAPPED entre chaque appels (je ne dis pas de refaire l'Event, par contre)...
    Edit: Pareil pour EventMask...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Par défaut
    si je refait ma structure , elle n'aura plus l'event :/

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Tu n'as qu'à mémoriser son handle dans une autre variable...

    Code C : 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
    //---------------------------------------------------------------------------
    #include <windows.h>
    #include <assert.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <stdio.h>
     
    //---------------------------------------------------------------------------
     
    #pragma argsused
    int main(int argc, char* argv[])
    {
    	HANDLE hComm;
    	hComm = CreateFile("COM1",GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
    	if (hComm == INVALID_HANDLE_VALUE) {
    		printf("Erreur d'ouverture de port");
    	} else {
    		if (SetCommMask(hComm,EV_RXCHAR)) {
    			HANDLE hEvent = CreateEvent(
    			 NULL,
    			 TRUE,
    			 FALSE,
    			 NULL);
    			while (true) {
    				DWORD EventMask;
    				OVERLAPPED over;
    				over.hEvent = hEvent;
    				over.Internal=0;
    				over.InternalHigh=0;
    				over.Offset=0;
    				over.OffsetHigh=0;
    				assert(over.hEvent);
    				if (WaitCommEvent(hComm,&EventMask,&over)) {
    					if (EventMask & EV_RXCHAR){
    						printf("caractère reçus");
    						getch();
    					}
    				} else {
    					printf("Error %d",GetLastError());
    					getch();
    				}
    			}
    		} else {
    			printf("erreur creation event %d",GetLastError());
    		}
    	}
    	getch();
    	return 0;
    }
    Mais d'un autre côté, je pense que ce n'était pas vraiment la source du problème: Le problème, c'est apparemment que WaitCommEvent() est supposée retourner ERROR_IO_PENDING, et que tu dois alors faire un WaitForSingleObject() sur hEvent...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Par défaut
    J'ai essayer les 2 solution

    toujours rien

    Edit: j'ai remplacer le FILE_FLAG_OVERLAPPED par 0 et maintenant ça passe , mais après il faudrai que je sache pourquoi >< (je doit présenter mon projet pour mon bts) donc quelqu'un aurai une idée ? ^^'

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 435
    Par défaut
    Le flag FILE_FLAG_OVERLAPPED indique que la lecture doit être asynchrone d'où l'utilisation d'un event pour indiquer quand un caractère est disponible.
    Cet event est réinitialisé sur l'appel de WaitCommEvent et est "signalé" lors de l'arrivée d'un caractère.

    Doc MSDN :
    http://msdn.microsoft.com/en-us/libr...79(VS.85).aspx

    La liaison est asynchrone, la création/ouverture du port COM est asynchrone mais tout votre code est synchrone.

    Soit vous faite une proc"de de lecture synchrone dans un thread auxiliaire, soit vous gérer l'asynchronisme dans votre thread principale via l'utilisation de boucle de message.

    Il faut faire un choix.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Par défaut
    En faite la c'est un prog de test dans le prog principale, j'ai un thread pour la lecture

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Par défaut
    Salut

    Bon voilà mon code à bien évoluer je l'ai repris en grande partie en me basant sur la FAQ c++ et ça marche presque bien ^^

    Je vous explique, j'arrive bien à savoir si il y à eu un event, donc mon prog reste bloquer sur WaitForMultipleObject(...) quand j'envoie des caractères il passe bien à la suite , le problème est que , après dans le tour de boucle suivant il n'est plus bloquant mais le redevient par la suite

    Je vous C/c mon code

    serie.cpp
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    //---------------------------------------------------------------------------
    #include "serie.h"
    #include <assert.h>
    #include <vcl.h>
    //---------------------------------------------------------------------------
    
    
    serie::serie()
    {
            connecter = false;
    }
    
    serie::~serie(){
    
    }
    
    bool serie::connexion(){
            bool retour=true;
            hcomm=CreateFile(
            "COM1",
            GENERIC_WRITE|GENERIC_READ,
            0, // accée exclusif
            NULL, // attribue de sécurité par défaut
            OPEN_EXISTING,
            FILE_FLAG_OVERLAPPED,
            NULL);
            if (hcomm==INVALID_HANDLE_VALUE) // Si la connection n'a pas été faite ont retournera false
            {
                    retour = false;
            }
            else
            {
    
                    GetCommState(hcomm,&config_serie);
                    config_serie.BaudRate = 115200;
                    config_serie.ByteSize =8;
                    config_serie.Parity = NOPARITY;
                    config_serie.StopBits = ONESTOPBIT;
                    SetCommState(hcomm,&config_serie);
                    connecter=true;
            }
            return retour;
    }
    
    void serie::envoi_trame(char *trame){
            if(connecter==true){
                    unsigned long pt;
                    WriteFile(hcomm,trame, strlen(trame)+1,&pt,&over); // ecrit sur le port
                    PurgeComm(hcomm,PURGE_TXCLEAR); // Purge le buffer du port série
            }
    }
    
    char *serie::lecture_trame(unsigned long taille){
    
            unsigned long pt;  char trame[100];
            ReadFile(hcomm,&trame, 255,&pt, &over); // ecrit sur le port
            PurgeComm(hcomm,PURGE_RXCLEAR); // Purge le buffer du port série
            return trame;
                }
    
    void serie::deconnexion(){
            if(connecter==true){
                    CloseHandle(hcomm);
            }
    }
    
    bool serie::WaitCommEvent2(DWORD &EventMask){
            bool retour=true;
            if (connecter == true){
                    if (!WaitCommEvent(hcomm,&EventMask,&over)){
                            ShowMessage(GetLastError());
                            retour=false;
                    }
            }else{
                    retour = false;
            }
            return retour;
    }
    
    DWORD WINAPI serie::Thread_reception(LPVOID lpParam){
    /*        serie * Tserie = (serie *)lpParam;
            DWORD EventMask=0;
            while(1){
                    if (!Tserie->WaitCommEvent2(EventMask)){
                            switch (GetLastError()){
                                    case 87:
                                    case ERROR_IO_PENDING:
                                    break;
    
                                    default:
                                            int i = 0;
                                    break;
                            }
                    }
                    WaitEvent = WaitForMultipleObjects(2,Tserie->hThreadEvent,FALSE,INFINITE);
                    if (WaitEvent == 0){
    
                    }
                    if (WaitEvent == 1){
                            if (EventMask & EV_RXCHAR){
                                    struct_event->t++;
                            }
                    }
            }   */
    }
    
    bool serie::init_thread(){
            bool retour = true;
            SetCommMask(hcomm,EV_RXCHAR); // Sélection de l'évenement pour declancher la lecture
            over.hEvent= CreateEvent (
                    NULL, // Attribu de sécurité
                    FALSE, // Reset de l'évenement automatiquement
                    FALSE,// Etat initial de l'évement
                    NULL);
            over.Internal=0;
            over.InternalHigh=0;
            over.Offset=0;
            over.OffsetHigh=0;
    
            if (SetEvent(over.hEvent)){
                    ShowMessage("Event Reception OK");
                    hThreadEvent[0] = over.hEvent;
            }
    
            hThreadEvent[1] = CreateEvent(NULL,TRUE,FALSE,NULL);
            if (SetEvent(hThread_event[1])){
                    ShowMessage("Event Stop Ok");
                    ResetEvent(hThreadEvent[1]);
            }
            hThread = CreateThread(
            0,
            0,
            Thread_reception,
            (LPVOID)this,
            NULL,
            &id_thread);
            if (hThread == NULL){
                    retour = false;
            }
            return retour;
    }

    serie.h
    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
    //---------------------------------------------------------------------------
    #include <windows.h>
    #include <vcl.h>
    class serie
    {
            private:
                    DCB config_serie;      // Variable de type d'une structure de configuration du port com
                    HANDLE hcomm,hThreadEvent[2];       // HANDLE pour le port série
                    OVERLAPPED over;
                    bool connecter,donnee; // permet de savoir si la connection à déjà été effectué
                    DWORD id_thread; // Masque de l'évenement
                    bool Status_event;
                    bool envoi;
    
            public:
                    HANDLE hThread;
                    serie();
                    ~serie();
                    bool connexion();
                    void envoi_trame(char *trame);
                    char *lecture_trame(unsigned long taille);
                    bool init_thread();
                    bool WaitCommEvent2(DWORD &EventMask){
                    static DWORD WINAPI Thread_reception(LPVOID lpParam);
                    void deconnexion();
    
    
    };
    
    //---------------------------------------------------------------------------
    Je sais que tout n'est pas codé proprement mais c'est du temporaire

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 435
    Par défaut
    Je n'ai pas lu tout le code qui me semble bien complexe vis à vis de la tâche à réaliser.
    Il y a du code en commentaire, j'espère qu'il ne l'est pas dans les versions que vous testez.
    Les symptômes me font penser à une mauvaise gestion du signalement des évènements. Et, dans le code les Events sembles être à réamorçage manuel mais je ne les vois pas (les réamorçages) dans le code.

Discussions similaires

  1. Problème avec l'event mouse_enter
    Par jerrypeeren dans le forum Framework .NET
    Réponses: 7
    Dernier message: 14/03/2013, 01h29
  2. [AC-2007] problème avec treeview_nodeClick event
    Par orfeu dans le forum IHM
    Réponses: 3
    Dernier message: 03/09/2012, 09h58
  3. Problème avec un event
    Par Rapha222 dans le forum C#
    Réponses: 3
    Dernier message: 12/12/2008, 07h42
  4. Problème avec les events MouseEnter, Leave
    Par Kaidan dans le forum Silverlight
    Réponses: 0
    Dernier message: 30/10/2008, 08h47
  5. Problème avec event handler
    Par MASSAKA dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 15/11/2005, 09h31

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