Re[7]: Двойное срабатывание WaitCommEvent
От: _alecs Россия  
Дата: 20.02.08 17:18
Оценка:
Здравствуйте, quodum, Вы писали:

Q>Здравствуйте, _alecs, Вы писали:


Q>[]


Q>А ты уверен, что срабатывает именно это событие? У тебя в коде их вроде две штуки. Или три.

Q>Приведи лучше код еще раз, только теперь целиком.

Ок! Действующий код приведу чуть попозже, но отличий там небудет. Он будет лишь иметь дополнительный класс TCom в котором и будут реализованны метод — инициализация порта, запись/чтение данных и ожидание события. Событие по записи oWrite.hEvent не используется. Используются только три события oWait.hEvent для ожидания события от порта, oRead.hEvent для чтения данных и hBreakEvent для прекращения операций и завершения потока. Возвращаемое событие EV_RXCHAR тоже проверяется. Как уже сказал точный код приведу попозже, но основной цикл будет выглядеть примерно так:

pCom->SetMask( EV_RXCHAR );


while( ! Terminated )
{
// Ожидаем событие от ком-порта.
if ( ! pCom->WaitEvent( &dwEvtMask ) ) continue;

if ( dwEvtMask != EV_RXCHAR ) // ТОЧКА ОСТАНОВА
{
Error.Object = "Com-port";
Error.Description = "Объект pCom вернул незаданное событие.";
throw Error;
}

// Читаем данные (т.к. межбайтовый таймаут 1 мск).
pCom->Read( lpData, sizeof(lpData), &dwLength );
}

1. Запускаем — смотрим...
2. Посылаем 6-ть байт
3. Срабатывает ТОЧКА ОСТАНОВА.
4. Проверяем событие — dwEvtMask == EV_RXCHAR.
5. Читаем данные — dwLength == 6.
6. Запускаем WaitEvent — сразуже получаем EV_RXCHAR (проверяем, действительно сработало событие oWait.hEvent).
7. Читаем данные — dwLength == 0.
8. Запускаем WaitEvent — уходит на ожидание EV_RXCHAR (при повторной посылки всё повторяется).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.