У меня такой вопрос: EV_TXEMPTY — это события или состояние ?
Вопрос возник вот почему:
После отправки 7 байт в порт (NON_EVERLAPPED) я вставляю задержку в 30 миллисекунд.
После задержки я устанавливаю SetCommMask(hComm, EV_TXEMPTY);, вызываю WaitCommEvent(hComm, &commEvent, NULL); — и оно работает, функция ловит событие !
Вопрос — почему ? По идее 30 миллисекунд более чем достаточно чтобы отправить все сообщение. Последний байт должен был быть давно выпихнут в линию, событие сгенерировано и WaitCommEvent должен был пропустить это событие. Но он его видит, что наталкивает меня на мысль что EV_TXEMPTY генерируется если в самом ком-порте устарновлен флаг, говорящий о том что буффер пустой.
# EV_TXEMPTY — эвент говорящий лишь о том, что в порт можно еще что-нибудь записать, при этом отнюдь не о том, что переданы все байты от предыдущей записи. Даже когда не было буфера FIFO в микросхеме порта — это прерывание возникало сразу после записи первого байта в порт, но это из опыта программирования под DOS и программирования микроконтроллеров, типа 51 машины;
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Здравствуйте, wallaby, Вы писали:
W>Здравствуйте, svladimiri, Вы писали:
S>>Добрый день,
S>>У меня такой вопрос: EV_TXEMPTY — это события или состояние ?
W>здесь написано следующее (сам не проверял):
W># EV_TXEMPTY — эвент говорящий лишь о том, что в порт можно еще что-нибудь записать, при этом отнюдь не о том, что переданы все байты от предыдущей записи. Даже когда не было буфера FIFO в микросхеме порта — это прерывание возникало сразу после записи первого байта в порт, но это из опыта программирования под DOS и программирования микроконтроллеров, типа 51 машины;
Хм... MSDN говорит другое Но не удивляюсь этому, т-к:
Сегодня обнаружил опытным путем что WaitCommEvent смотрит эвенты возникшие после вызова SetCommMask, а не после того как он сам был вызван.
Для меня это было немного странным, в MSDN ничего о том что должно быть так, не нашел.
Здравствуйте, svladimiri, Вы писали:
S>Хм... MSDN говорит другое Но не удивляюсь этому, т-к: S>Сегодня обнаружил опытным путем что WaitCommEvent смотрит эвенты возникшие после вызова SetCommMask, а не после того как он сам был вызван.
IMHO, это правильное поведение. Именно так работают события — объекты синхронизации Windows. Ну и логично, что эвенты порта ведут себя также.
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Здравствуйте, wallaby, Вы писали:
W>Здравствуйте, svladimiri, Вы писали:
S>>Хм... MSDN говорит другое Но не удивляюсь этому, т-к: S>>Сегодня обнаружил опытным путем что WaitCommEvent смотрит эвенты возникшие после вызова SetCommMask, а не после того как он сам был вызван.
W>IMHO, это правильное поведение. Именно так работают события — объекты синхронизации Windows. Ну и логично, что эвенты порта ведут себя также.
Дело в том что это никак не указано в MSDN.
Все что он говорит:
— setcommmask говорит что слушать
— WaitCommMask ловит события которые происходят.
Ни слова о том, когда эти сообщения начинают регистрироваться.
Работа с портом такая штука, где важен каждый бит, особенно когда работаешь с другим устройством через его протокол. И мне кажется странным, что я не могу по сути дела полностью контролировать этот процесс.
Потому как непонятно сколько сообщений будет сохранено (там очередь или одно последнее сохраняется, или первое или еще что) и т.п.
Если где в MSDN или интернете есть место где об этом прямо говориться — покажи, плз. Мне нужно точно знать что происходит чтобы не напортачить в программе.
Здравствуйте, svladimiri, Вы писали:
S>Работа с портом такая штука, где важен каждый бит, особенно когда работаешь с другим устройством через его протокол. И мне кажется странным, что я не могу по сути дела полностью контролировать этот процесс. S>Потому как непонятно сколько сообщений будет сохранено (там очередь или одно последнее сохраняется, или первое или еще что) и т.п.
Там нет никакой очереди — просто устанавливаются флаги для эвентов, указанных в SetCommMask, а WaitCommEvent срабатывает на эти флаги, вне зависимости от того когда флаг установлен — до или после вызова WaitCommEvent.
S>Если где в MSDN или интернете есть место где об этом прямо говориться — покажи, плз. Мне нужно точно знать что происходит чтобы не напортачить в программе.
Ничего страшного, на ошибках учатся. . С последовательным портом трудно разбираться первый раз, потом забываешь все трудности — нет там ничего очень сложного. Одну ссылку я уже давал, погугли — найдешь ещё.
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true