Как почистить буфер COM-порта (C++, WIN32 API)?
От: sk_alex Россия  
Дата: 11.04.03 13:45
Оценка:
Подскажите, как почистить буфер COM-порта (C++, WIN32 API)?

Ситуация следующая:
Имеется некоторое устройство, подключаемое к компьютеру по COM-порту. Обмен между устройством и COM-портом производится пакетами по 4 байта: 4 байта посылаются в устройство, устройство через некоторое время отвечает тоже 4-мя байтами. Предположим устройство не успевает ответить и программа вываливается по таймауту — неудачная транзакция, генерируется исключение, обрабатываемое соответсвующим образом. Однако после этого устройство все же отвечает и в буфере COM-порта лежат некие данные. При посылке следующих 4-х байт программа вычитывает не то, что нужно, а то, что ответила железка на прошлую неудачную команду. Ну и т.д.

Выход — чистить буфер COM-порта перед каждой операцией. Вопрос: как это сделать?

Вариант, который мне приходит в голову, очень навороченный: выделять отдельную нитку, которая крутится в постоянном цикле WaitCommEvent -> Вычитывание данных в свой локальный буфер. После этого основная программа работает уже с локальным буфером нитки, а буфер COM-порта всегда пустой. Но больно уж замороченно получается. Попроще никак нельзя?
Re: Как почистить буфер COM-порта (C++, WIN32 API)?
От: kiamor  
Дата: 11.04.03 13:58
Оценка:
Здравствуйте, sk_alex, Вы писали:

_>Подскажите, как почистить буфер COM-порта (C++, WIN32 API)?


А ::FlushFileBuffers( m_hCOM ) тебя не устраивает?
Re[2]: Как почистить буфер COM-порта (C++, WIN32 API)?
От: sk_alex Россия  
Дата: 11.04.03 14:09
Оценка:
Здравствуйте, kiamor, Вы писали:

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


_>Подскажите, как почистить буфер COM-порта (C++, WIN32 API)?


K>А ::FlushFileBuffers( m_hCOM ) тебя не устраивает?


Спасибо. Думаю, что устраивает. Тут я параллельно нашел такую функцию как PurgeComm. Пока еще не очень понял, чем она от FlushFileBuffers отличается. Но впрочем, главное — узнать названия. Далее MSDN поможет. Спасибо.
Re: Как почистить буфер COM-порта (C++, WIN32 API)?
От: Arslan Украина  
Дата: 11.04.03 14:12
Оценка:
Здравствуйте, sk_alex, Вы писали:

_>Выход — чистить буфер COM-порта перед каждой операцией. Вопрос: как это сделать?


перед каждым WriteFile() вызывать PurgeComm()
Re[3]: Как почистить буфер COM-порта (C++, WIN32 API)?
От: Dima2  
Дата: 11.04.03 14:14
Оценка:
Здравствуйте, sk_alex, Вы писали:

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


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


_>Подскажите, как почистить буфер COM-порта (C++, WIN32 API)?


K>А ::FlushFileBuffers( m_hCOM ) тебя не устраивает?


_>Спасибо. Думаю, что устраивает. Тут я параллельно нашел такую функцию как PurgeComm.

вот ее и пользуй
PurgeComm( h, PURGE_RXCLEAR... );
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.