Тонкий вопрос о Serial Communications
От: svladimiri  
Дата: 23.07.07 23:28
Оценка:
Добрый день,

У меня такой вопрос: EV_TXEMPTY — это события или состояние ?

Вопрос возник вот почему:
После отправки 7 байт в порт (NON_EVERLAPPED) я вставляю задержку в 30 миллисекунд.
После задержки я устанавливаю SetCommMask(hComm, EV_TXEMPTY);, вызываю WaitCommEvent(hComm, &commEvent, NULL); — и оно работает, функция ловит событие !

Вопрос — почему ? По идее 30 миллисекунд более чем достаточно чтобы отправить все сообщение. Последний байт должен был быть давно выпихнут в линию, событие сгенерировано и WaitCommEvent должен был пропустить это событие. Но он его видит, что наталкивает меня на мысль что EV_TXEMPTY генерируется если в самом ком-порте устарновлен флаг, говорящий о том что буффер пустой.

Что посоветуете, коллеги ?
Re: Тонкий вопрос о Serial Communications
От: wallaby  
Дата: 24.07.07 04:29
Оценка:
Здравствуйте, svladimiri, Вы писали:

S>Добрый день,


S>У меня такой вопрос: 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
Re[2]: Тонкий вопрос о Serial Communications
От: svladimiri  
Дата: 24.07.07 04:39
Оценка:
Здравствуйте, wallaby, Вы писали:

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


S>>Добрый день,


S>>У меня такой вопрос: EV_TXEMPTY — это события или состояние ?


W>здесь написано следующее (сам не проверял):


W># EV_TXEMPTY — эвент говорящий лишь о том, что в порт можно еще что-нибудь записать, при этом отнюдь не о том, что переданы все байты от предыдущей записи. Даже когда не было буфера FIFO в микросхеме порта — это прерывание возникало сразу после записи первого байта в порт, но это из опыта программирования под DOS и программирования микроконтроллеров, типа 51 машины;


Хм... MSDN говорит другое Но не удивляюсь этому, т-к:
Сегодня обнаружил опытным путем что WaitCommEvent смотрит эвенты возникшие после вызова SetCommMask, а не после того как он сам был вызван.

Для меня это было немного странным, в MSDN ничего о том что должно быть так, не нашел.
Re[3]: Тонкий вопрос о Serial Communications
От: wallaby  
Дата: 24.07.07 08:54
Оценка:
Здравствуйте, 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
Re[4]: Тонкий вопрос о Serial Communications
От: svladimiri  
Дата: 24.07.07 09:24
Оценка:
Здравствуйте, wallaby, Вы писали:

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


S>>Хм... MSDN говорит другое Но не удивляюсь этому, т-к:

S>>Сегодня обнаружил опытным путем что WaitCommEvent смотрит эвенты возникшие после вызова SetCommMask, а не после того как он сам был вызван.

W>IMHO, это правильное поведение. Именно так работают события — объекты синхронизации Windows. Ну и логично, что эвенты порта ведут себя также.


Дело в том что это никак не указано в MSDN.
Все что он говорит:
— setcommmask говорит что слушать
— WaitCommMask ловит события которые происходят.

Ни слова о том, когда эти сообщения начинают регистрироваться.

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

Если где в MSDN или интернете есть место где об этом прямо говориться — покажи, плз. Мне нужно точно знать что происходит чтобы не напортачить в программе.
Re[5]: Тонкий вопрос о Serial Communications
От: wallaby  
Дата: 24.07.07 10:03
Оценка:
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.