ReAl (02.02.2010 14:13 - 14:17, просмотров: 354) ответил pav256 на Если можно чуть подробнее. Протокол использую аналогичный Вашему, стартовая и стоповые байты различны + байтстаффинг. Как активировать событие по приходу посылки в Win XP? Если можно подробнее или фрагмент кода. Плиз!
Ну так прописать стоповый байт как event, OVERLAPPED IO и ждать события, а не символа Проверку ошибок для простоты опустил.
HANDLE hCom = CreateFile( str, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
...
DCB commdcb;
memset(&commdcb, 0, sizeof(commdcb));
commdcb.DCBlength = sizeof(commdcb);
commdcb.BaudRate = baud;
...
commdcb.EvtChar = SLIP_END;
...
SetCommState( hCom, &commdcb);
...
...
HANDLE hRxEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
OVERLAPPED ov = { 0 };
ov.hEvent = hRxEvent;
HANDLE whandles[2] = {
hTerminateEvent, // это глобальное событие для всех потоков от главного - "закрываемся"
hRxEvent // а это передастся в WaitCommEvent в составе ov
};
for (;;) {
DWORD status;
if ( !WaitCommEvent(hComm, &status, &ov)) {
// если EvtChar ещё не принят - ждать одного из двух событий
DWORD error = GetLastError();
if (error == ERROR_IO_PENDING) {
DWORD res =
WaitForMultipleObjects(2, whandles, FALSE, INFINITE);
switch (res) {
default:
// этого не может быть потому, что этого не может быть никогда
// реакция по вкусу
continue;
case WAIT_OBJECT_0: // terminate request
ResetEvent(hTerminateEvent);
EscapeCommFunction(hComm, CLRRTS);
status = SR_DONE;
_endthread();
return;
case WAIT_OBJECT_0 + 1: // EV_RXFLAG
ResetEvent(hRxEvent);
break; // to read received chars
}
}
}
// узнаём, сколько в буфере и выгребаем всё
COMSTAT cstat;
ClearCommError(hComm, &status, &cstat);
DWORD available = cstat.cbInQue;
if (!available)
continue;
// после EvtChar могло прийти ещё что-то, занчит по EvtChar заканчиваем формирование
// пакета и ставим в очередь приёма, после чего разбираем остаток
// в новый недоформированный пакет
...
// и переходим на начало for
}