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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 395
    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 395
    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 395
    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 395
    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 502
    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 502
    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.

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