Com. série rs232 (GetOverlappedResult)

LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 - 4 juin 2007 à 14:19
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 - 5 juin 2007 à 09:33
Bonjour a tous,

voila j'essaye de programmer un peit logiciel qui permettra de lire et ecrire sur le port COM.
pour tout ce qui est d'ouvrir , lire , ecrire etc... je pense connaitre les fonctions
par contre en approfondissant sur ce sujet je me suis apercu qu'en mode OVERLAPPED
et en créant un événement on pouvait éviter de bouffer du processus inutilement.
avec la fonction WAITCOMEVENT!
mais je me retrouve bloqué ensuite par :GetOverlappedResult
alors voici le code trouvé sur différent sites de prog. :

// tant que le thread est actif
    while(pManager->m_bReadThreadRunning)
    {
        // attente de la réception d'un caractère
        DWORD dwEvtMask = 0;
        OVERLAPPED ov = {0};
        ov.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        if(!pManager->m_pComm->WaitEvent(&dwEvtMask, &ov))//waitcommEvent n'attends pas
                                                                        //Si l'evenement a pas eu lieu, getlasterror renvoie ERROR_IO_PENDING
        {
            // si toujours en attente
            if(GetLastError() == ERROR_IO_PENDING)
            {
                // on attent que l'opération se termine ou qu'elle soit interrompue
                // (lors de l'appel à SetEvtMak(0) à la deconnexion par exemple)
                DWORD dwResult;
                while(!GetOverlappedResult(pManager->m_pComm->GetHandle(), &ov,
                        &dwResult, TRUE))//on attend l'evenement sans faire tourner le processeur
                {
                    if(GetLastError() != ERROR_IO_INCOMPLETE)
                        break;
                }
            }
        }

        // lecture si des caractères ont été reçus
        if(dwEvtMask & EV_RXCHAR)
        {
            // lecture des données

je pense saisir le principe global ( gestion des evenements pour multithread, pr éviter pb de cpu)
mais voila ce que je cherche a faire dans mon thread( en gros) :

while (1)
{
if( marche dégradée == 1) write ENQ
nread = readCOM
if nread>0
//traitement des données puis envoi de réponse si necessaire//si message ENQ -> marche dégradée0
}

en gros 'readCom' correspond au code que j'ai mis en bleu mais le pb est que ce code est bloquant,
du coup si je ne lis rien je ne peux pas continuer d'emettre mon ENQ...

alors soit je n'ai pas tout compris , soit ce n'est pas possible a faire?

J'espere que vous pourrez m'aider MERCI!

 

1 réponse

LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
5 juin 2007 à 09:33
personne ne peut m'aider pour que ma boucle corresponde bien a mes besoins?

 
0
Rejoignez-nous