ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
3 мая
180102 Топик полностью
ReAl (02.02.2010 14:13 - 14:17, просмотров: 325) ответил 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 }