Bonjour à tous,
je communique avec un dispositif électronique via un port COM du PC. J'aimerai mettre le signal RTS à 1 avant d'envoyer ma trame, et le remettre à 0 quand tous les caractéres sont effectivement partis du port. Voici un extrait de mon code :
DWORD dwEvtMask;
char *bufferS = "toto";
// ouverture du port nomPort
hPort = CreateFile
( "COM1", GENERIC_WRITE|GENERIC_READ,0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, );
// mise en place du mask d'événement ==> dernier caractére envoyé (????)
SetCommMask(hPort, EV_TXEMPTY)
// création de l'événement qui signalera la fin de l'envoi; RAZ manuel; non signalé au départ
overloppedAttEnvoi.hEvent = CreateEvent(NULL, true, 0, NULL);
overloppedAttEnvoi.Internal = 0;
overloppedAttEnvoi.InternalHigh = 0;
overloppedAttEnvoi.Offset = 0;
overloppedAttEnvoi.OffsetHigh = 0;
// création de l'événement qui signalera la fin de l'écriture; RAZ auto; non signalé au départ
overloppedEcri.hEvent = CreateEvent(NULL, false, 0, NULL);
overloppedEcri.Internal = 0;
overloppedEcri.InternalHigh = 0;
overloppedEcri.Offset = 0;
overloppedEcri.OffsetHigh = 0;
/* mise à 1 de RTS */
EscapeCommFunction(hPort,SETRTS)
// écrit
WriteFile(hPort, bufferS, nbCharAEcrire, &nbCharEcrit, &overloppedEcri)
// attend la fin de l'envoi
WaitCommEvent(hPort, &dwEvtMask, &overloppedAttEnvoi)
iLastErr = GetLastError();
if (iLastErr != ERROR_IO_PENDING)
printf ("Probleme à l'envoi! %i\n",iLastErr);
else
{
// l'envoi est en cours ==> attend la fin
rap = WaitForSingleObject(overloppedAttEnvoi.hEvent, 1000);
switch (rap)
{
case WAIT_OBJECT_0:
// fin de l'écriture, test
if (!GetOverlappedResult(hPort, &overloppedAttEnvoi, &nbCharEcrit, false))
{
iLastErr = GetLastError();
if (iLastErr == ERROR_IO_INCOMPLETE)
printf("%s %d","Operation d'envoi incompléte",iLastErr);
else
printf ("Erreur pendant l'envoi : %x et rap : %d\n" , GetLastError(),rap);
}
else
{
// fin de l'envoi
ResetEvent(overloppedAttEnvoi.hEvent);
EscapeCommFunction(hPort,CLRRTS) // met à 0 RTS
}break;
default:
printf ("Erreur pendant l'envoi : %x et rap : %d\n" , GetLastError(),rap);
}
}
Normalement je remet à 0 RTS quand le dernier caractère est parti, mais NON!
RTS redescend en plein milieu de ma trame!!!
Je n'arrive pas à voir ce qui se passe, alors si quelqu'un a une idée je prend.
Merci.
Lamalice83[/font=Comic Sans MS]
