julienbj
Messages postés452Date d'inscriptionjeudi 4 décembre 2003StatutMembreDernière intervention19 décembre 2008
-
25 janv. 2007 à 16:17
julienbj
Messages postés452Date d'inscriptionjeudi 4 décembre 2003StatutMembreDernière intervention19 décembre 2008
-
26 janv. 2007 à 11:13
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!
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);
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 25 janv. 2007 à 17:16
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.
julienbj
Messages postés452Date d'inscriptionjeudi 4 décembre 2003StatutMembreDernière intervention19 décembre 200815 26 janv. 2007 à 11:13
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