![]() |
Win32API: Оптимальная организация асинхронного чтения COM-порта в отдельном потоке
Нашёл в инете несколько неплохих док по работе с COM-портом на Win32API (Титов, Кузан, Терехов и др.).
В одной из них предлагается следующий код для потока: Код:
procedure TReadThread.Execute; Допустим, в этом фрагменте кода подразумевается, что порт отслеживает только событие прихода во входной буфер первого символа (т.е. установили только флаг RXChar функцией SetCommEvent). Тогда всё сработает корректно. Но если порт отслеживает несколько событий ? - следовало бы определить тип события, которое установило hEvent в сигнальное сотояние. И если это не приход символа, то снова вызывать функцию WaitCommEvent, затем WaitForSingleObject, пока не возникнет событие прихода симола. Но как определить тип события, ведь в структуре OverRead (типа Overlapped) нет полей с информацией о типе произошедшего события, а данные по указателю dwMask не будут определять тип произошедшего события, т.к. функция WaitCommEvent завершится до наступления события (т.е. параметр wdMask функции WaitCommEvent при асинхронных операциях бесполезен) ? 2. Функция ClearCommError в данном фрагменте кода используется только для того, чтобы получить число символов во входном буфере (cbInQue) ? Или здесь обязателен сброс признака ошибки (т.е. что будет, если ошибку не сбросить) ? 3. Может ли функция WaitCommEvent в данном фрагменте вернуть 0 (теоретически), в коде этот случай не рассматривается... Т.е. может ли произойти событие в ходе выполнения этой функции (после сброса hEvent'а функцией) ? 4. Можно ли получить число символов во входном буфере без использования функции ClearCommError ? |
Неужели с Com-портом никто не работал ?
|
никакой специфики тут нет. Просто читайте программу.
Код:
while not Terminated do |
Объясните мне плиз, функция WaitCommEvent() запрашивает событие по маске, а функция WaitForSingleObject ждет это событие, так получается? И тогда цикл while останавливается или продолжает выполнятся?
|
Время: 12:55. |
Время: 12:55.
© OSzone.net 2001-