Ecriture port série --> Erreur 997

Résolu
Signaler
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
-
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
-
Bonjour,
Je suis en train de développer une petite classe (si on peut appeler ca comme ca en C) pour piloter mes ports séries.
Rien de bien compliqué en soi, ce n'est pas la première fois que j'en développe une. Je voulais seulement en faire une que je puisse réutiliser dans tous mes futurs projets sans avoir à retoucher à droite à gauche certaines commandes.

Voila donc comment je m'y prends:
//Ouverture du port
CreateFile(me->name, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

Une fois ouvert, je lui mets sa configuration avec SetCommState et ses timeout (tous à 0) avec SetCommTimeouts.
Une fois que c'est fait (tout est OK la dedans), je cree un thread d'écoute sur mon port série.
La non plus toujours pas de probleme.
Et c'est la que les choses se gatent!
Je veux envoyer maintenant des données sur le port série.
Voici la fonction:
    SERIAL_UINT32 lenWritten = 0;
    OVERLAPPED overlappedWrite = {0, 0, 0, 0, NULL};
    if (WriteFile(me->hSerial, data, len, &lenWritten, &overlappedWrite))
        return SERIAL_TRUE;
    //err = GetLastError(); --> Ici err vaut 997
    return SERIAL_FALSE;
Lorsque j'execute cette fonction, je vois bien mes données arriver sur mon récepteur, mais la fonction me renvoie un code d'erreur.

D'ou peut bien provenir cette erreur et comment ne plus l'avoir?
Merci de votre aide!

Pour avoir la totalité du code aller ici: http://baronju.free.fr/Travail/En%20cours/Serial/
Vive le C
Savon

3 réponses

Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
15
En fait c'est bon, j'ai compris mes erreurs.
J'avais vraiment rien compris à la façon d'écrire sur le port série avec les overlapped.

Probleme corrigé ;)

Voici pour ceux que ca pourrait intéressé la fonction d'envoie (un peu plus compliqué que la précédente)

SERIAL_BOOL serial_send(SERIAL_OBJ        *me,
                        SERIAL_VOID        *data,
                        SERIAL_UINT32    len)
{
    SERIAL_UINT32 lenWritten, offStart;
    DWORD lastError, handleSignaled;
    HANDLE waitFor[2];
    OVERLAPPED overlappedWrite = {0, 0, 0, 0, NULL};

    overlappedWrite.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
    if (overlappedWrite.hEvent == NULL) return SERIAL_FALSE;

    waitFor[0] = me->hEventCom1;
    waitFor[1] = overlappedWrite.hEvent;

    offStart = 0;
    do //Boucle d'envoi tant qu'il y a des données à envoyer
    {
        lenWritten = 0;
        if (!WriteFile(me->hSerial, (SERIAL_UINT8 *) ((SERIAL_UINT8 *) (data) + offStart), len, &lenWritten, &overlappedWrite))
        {
            lastError = GetLastError();
            if (lastError == ERROR_INVALID_HANDLE) //Port probablement fermé pendant l'envoi
                return SERIAL_FALSE;
            if (lastError != ERROR_IO_PENDING) //On ne sait pas trop de quelle erreur il s'agit
                return SERIAL_FALSE;

            handleSignaled = WaitForMultipleObjects(2, waitFor, FALSE, INFINITE);
            switch (handleSignaled)
            {
            case WAIT_OBJECT_0:    //Fermeture du port série
                return SERIAL_FALSE;

            case WAIT_OBJECT_0 + 1: //Fin de l'envoie sur le port série --> Récupération de la valeur de WriteFile
                break;

            case WAIT_FAILED:    //Ne doit pas arriver
            default:            //Ne doit pas arriver
                return SERIAL_FALSE;
            }

            if (!GetOverlappedResult(me->hSerial, &overlappedWrite, &lenWritten, TRUE))
                return SERIAL_FALSE;
        }

        len -= lenWritten;
        offStart += lenWritten;
    } while (len > 0);

    return SERIAL_TRUE;
}
Vive le C
Savon
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

J'ai pas bien saisi l'utilité de l'overlapped ici vu que tu attend que
l'operation se termine juste apres le WriteFile. Tout tes WriteFile
sont executés les uns a la suite des autres et non pas en parallele. Un
WriteFile bloquant aurait donné le même resultat, avec un code beaucoup
plus simple.

Sinon au niveau du code, il semblerait que tu ai oublié de fermer le handle de l'event.
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
15
Merci pour la remarque sur le CloseHandle, effectivement, je l'avais zappé.

Pour l'overlapped, j'ai besoin de pouvoir lire et écrire sur le port série simultanément (dans 2 threads différents evidemment).
Si tu connais un moyen pour le faire sans passer par l'overlapped, je suis tout ouie.
Vive le C
Savon