Re[14]: Двойное срабатывание WaitCommEvent
От: _alecs Россия  
Дата: 22.02.08 10:58
Оценка:
Здравствуйте, Sergei I. Gorelkin, Вы писали, мы читали.

Сбрасывать dwEvtMask в ноль перед вызовом WaitCommEvent не имеет никакого смысла, потому что этот аргумент для функции является выходным, и функция запишет в эту переменную своё значение. Повторяю 'запишет', а не установит отдельные биты соответствующие поступившем событиям. Так что перестраховываться и сбрасывать эту переменную в ноль нету смысла. И ещё хочу указать Вам на различия в синхронной и асинхронной работе Вашего (т.к. Ваш ком-порт был открыт без флага FILE_FLAG_OVERLAPPED, иначе аргумент lpOverlapped в вызове функции WaitCommEvent обязан был иметь указатель на структуру OVERLAPPED) и моего приложения. Нет-нет, я не хочу рассказывать об принципах синхронной и асинхронной работы которые и так всем известны, а только об особенностях ком-порта.

И так, особенностью синхронной и асинхронной работы ком-порта является то, что при синхронной работе невозможна одновременная запись и чтение данных из и в ком-порт. Другими словами перед тем как записать данные в ком порт вам необходимо вышибить функцию WaitCommEvent с ожидания события. При этом Вам необходимо отследить, чтобы после прерывания функции WaitCommEvent поток ожидавший событие, не успел отработать и вновь сесть на ожидание события от ком-порта перед тем как вы попытаетесь записать данные в ком-порт. Отсюда следует что у Вас появятся ещё пара событий (или других объектов синхронизации), иначе ваше приложение иногда просто будет виснуть по непонятным для вас причинам.

В асинхронном же режиме такой проблемы нет. Один поток может писать данные в ком-порт, не обращая внимания на то, что второй поток в это время находится в ожидании/чтении данных из этого же ком-порта.

Игнорирование же ложных срабатывания WaitCommEvent не подходит для высокопроизводительных систем, которые ожидают начала поступления данных. После начала поступления данных, система переходит на время ожидания всей посылки. Если же начало посылки нет (устройство отсутствует), то система сразу переходит к следующему устройству, не дожидаясь времени окончания всей посылки. Что увеличивает производительность системы на порядок. Ложные же срабатывания заставляют систему дожидаться времени окончания посылки (тратить время), и затем уже фиксировать ошибку.

Вопрос такой: — "Как сделать так, чтобы при чтении данных ком-порта сбрасывалось событие EV_RXCHAR".

Кстати, Всем благодарен за ответы! И жду новых...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.