Re[8]: Двойное срабатывание WaitCommEvent
От: _alecs Россия  
Дата: 20.02.08 17:20
Оценка:
Здравствуйте, 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...
Пока на собственное сообщение не было ответов, его можно удалить.