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