Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Ecriture port série --> Erreur 997 [ Windows / Autre ] (julienbj)

jeudi 25 janvier 2007 à 16:17:14 | Ecriture port série --> Erreur 997

julienbj

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


jeudi 25 janvier 2007 à 16:38:40 | Re : Ecriture port série --> Erreur 997

julienbj

Réponse acceptée !

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


jeudi 25 janvier 2007 à 17:16:44 | Re : Ecriture port série --> Erreur 997

aardman

Membre Club
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.




vendredi 26 janvier 2007 à 11:13:04 | Re : Ecriture port série --> Erreur 997

julienbj


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




Cette discussion est classé dans : fonction, port, erreur, série, serial


Répondre à ce message

Sujets en rapport avec ce message

Port série [ par cheMoor ] Bonjour,Merci Ymca2003 de ton aide, ton programme semblé super, mais je n'arrive pas à le tester (car il est programmé en Visual C++ « les boutons, l fonction lire ds un port série [ par imanewin32 ] pour réaliser la lecture ds un prog qui gére la communication atravers un port série,j'ai réalisé le codeDWORD comserie::lectport(char* e,int t){ Set CreateFile et port COM supérieur à 9 [ par agremlins ] Bonjour,J'ai une dll qui s'occupe de la connexion avec des périphériques branchés sur le port série.J'utilise La fonction CreateFile pour ouvrir un po Fonction decrivant l'erreur commise à partir d'un numéro [ par thejojo1 ] Existe t-il une fonction qui renvoit la description de l'erreur commise?Par exemple, avec les socket, on pourrait l'utiliser comme ceci:GetDescError(W c++ et delete [ par anne-lise ] Bonjour !voila, j'ai un probleme lorsque je veux faire des delete sur des tableauz.J'ai une fonction du type :float* function(param, int n){   float* RTS du port série Linux [ par niel50 ] quelqu'un sait il comment modifier le RTS d'une liaison série sous linux de manière à mettre le port en received apres un envoi ( une simple activatio utiliser un port USB comme un port série [ par Radium The Hammer ] Bonjour, comme je l'ai lu dans le forum on peut utiliser un port USB par l'intermédiare d'un port série. Par exemple, quand j'utilise hyperterminal a créer un numéro de série [ par progrima ] je veux créer un numéro de série à partir des informations suivants : société, application, modules accordées, nombre d'utilisateur. je cherche une fo debutant [ par CCJ ] bonjour! alors voila g un tit bleme j'aimerais apellé une fonction avec : pass(); cette fonction est declarer comme ceci: void pass() {        } le c


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.