Здравствуйте, 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 (при повторной посылки всё повторяется).