-
Wait sur COM serie
Bonjour,
Je cherche à faire un WaitForMultipleObjects sur 2 handles :
- un sémaphore et
- un fichier ouvert sur port série ("COM1" par exemple).
Mon problème c'est que je sors immédiatement du Wait sur le handle du port serie. Comme s'il était tout le temps signalé. Hors quand je fais un read dessus le read est bloquant. Donc je pense que je n'ai pas compris comment fonctionne l'état de cet objet. Dans ma compréhension il est signalé quand il y a qqch à lire et non signalé quand il n'y a rien à lire.
Je n'ai pas trouvé ma réponse dans la FAQ ni le tuto.
Merci
-
A priori il n'y a pas bcps de gens inspirés par ce problème.
Bref je n'ai pas trouvé de solution élégante. Mais j'ai trouvé l'API WaitCommEvent qui m'a permise de coder un truc approchant.
D'abord il ne faut pas forcement utiliser le mode OVERLAPPED à l'ouverture. Mais j'ai utilisé :
MesHandles[HDL_COM] = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
Ensuite il faut sélectionner l'événement qui nous intéresse:? :
SetCommMask(MesHandles[HDL_COM], EV_RXCHAR);
Enfin dans un second thread j'ai l'attente sur le port serie :
if(WaitCommEvent(hCom, &MonMask, &AttenteWP) != 0)
{
hWP = OpenEvent(EVENT_MODIFY_STATE, FALSE, "ComWaitPoint");
SetEvent(hWP);
CloseHandle(hWP);
}
Et mon thread qui devait attendre sur 2 objets n'attends plus que sur un seul (j'ai "chainée" mon event série sur mon second event en quelques sortes) :
WaitForSingleObject(MesHandles[HDL_WAIT], INFINITE); // HDL_WAIT est le meme que "ComWaitPoint"
Pour rappel à l'origine mon idée etait de faire un truc plus simple de ce style :
MesHandles[HDL_COM] = CreateFile("COM1", ......);
MesHandles[HDL_WAIT] = OpenEvent(SYNCHRONIZE|EVENT_MODIFY_STATE, FALSE, "ComWaitPoint");
WaitForMultipleObjects(2, MesHandles, FALSE, INFINITE)
Voila c'était plus propre mais ca ne fonctionne pas. Donc il me faut un thread de plus sauf si vous me donner une meilleure solution.