 ReAl (02.02.2010 14:13 - 14:17, просмотров: 454) ответил pav256 на Если можно чуть подробнее. Протокол использую аналогичный Вашему, стартовая и стоповые байты различны + байтстаффинг. Как активировать событие по приходу посылки в Win XP? Если можно подробнее или фрагмент кода. Плиз!
 ReAl (02.02.2010 14:13 - 14:17, просмотров: 454) ответил 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
	}