Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задержка ClearCommError ??? после приема символа не сразу меняется 
:(
    Опции темы
takedo
Дата 19.9.2005, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



Вот заковыка та какая:
после того, как определяется, что в буфер поступил символ (порт инициализирован так например SetCommMask(m_hComm,EV_RXCHAR);), запрашиваем, сколько же у нас во входной очереди символов имеется через ClearCommError. Так вот не сразу меняется значение параметра cs.cbInQue!! Поэтому приходится делать дурацкую while!!!.
А как иначе??? Может есть где там каккой-то скрытый Event??? smile
Вот пример кода:
Код

ResetEvent(m_ovp_wait.hEvent);
if(!WaitCommEvent(m_hComm,&dwCommEvent,&m_ovp_wait))
{
   if(GetLastError()!=ERROR_IO_PENDING)
    {
    return PORTERROR;
    }
}
                
ret_wait = WaitForSingleObject(m_ovp_wait.hEvent,DELAY_TO);
switch(ret_wait)
{
case WAIT_OBJECT_0:
while(!cs.cbInQue)
{
if(!ClearCommError(m_hComm,&error,&cs))//далеко не с первого захода!!!
{
    return PORTERROR;
}
}
break;
case WAIT_TIMEOUT:
break;
default:
return PORTERROR;
}




--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
takedo
Дата 21.9.2005, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



Блин, так ни у кого никаких мыслей что-ли по поводу того как после выполнения асинхронного вызова WaitCommEvent гарантированно получить актуальное значение cs.cbInQue ???


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
JoyEx
Дата 28.12.2005, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



А почему ты не проверяешь dwCommEvent на EV_RXCHAR?


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
takedo
Дата 28.12.2005, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



JoyEx
Цитата
А почему ты не проверяешь dwCommEvent на EV_RXCHAR?

А что это поменяет?
Если я поставлю условие if(dwCommEvent & EV_RXCHAR){ClearCommError();...}, то я все равно на очередь не повлияю, в том то и дело, что (dwCommEvent & EV_RXCHAR) == true, а очередь равна нулю.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
JoyEx
Дата 28.12.2005, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



takedo

Не надо "влиять на очередь", ею занимается \Device\Serial0-1. Ты просто проверь не нуль ли в dwCommEvent.

smile ну и репутация у тебя smile "таганка, я твой навеки арестант"


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
takedo
Дата 28.12.2005, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



JoyEx
Все равно не понятно, ну проверю - нуль, дальше по логике опять WaitCommEvent(), но событие уже взвелось и если новых символов не прилетит, то я вылечу по таймауту, то есть с ошибкой(по крайне мере у меня так было), а на самом деле пришел правильный кадр.
Тут ведь вот в чем дело, может я чего недопонимаю, но когда приходит символ в потр, выставляется в "свободен" m_ovp_wait.hEvent, а очередь в этот момент равна 0 (не всегда, а когда поместил в буфер часть кадра, ту длина которой была в cbInQue)! Как это связано с проверкой dwCommEvent на EV_RXCHAR? НУ НЕПОНЯТНО! smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
JoyEx
Дата 28.12.2005, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



1)
Цитата(takedo @ 28.12.2005, 13:14)
Все равно не понятно, ну проверю - нуль, дальше по логике опять WaitCommEvent(), но событие уже взвелось и если новых символов не прилетит, то я вылечу по таймауту, то есть с ошибкой(по крайне мере у меня так было), а на самом деле пришел правильный кадр.


нет. m_ovp_wait у тебя для того, чтобы ждать завершения работы WaitCommEvent(), ты же сам проверяешь на PENDING.

2) Смотри выше п.1, про m_ovp_wait

===================
MSDN:
Цитата
EV_RXCHAR  - A character was received and placed in the input buffer.

хоть один байт значит получен


Цитата(takedo @ 19.9.2005, 13:53)
case WAIT_OBJECT_0:
while(!cs.cbInQue)
{
if(!ClearCommError(m_hComm,&error,&cs))//


сначало надо ClearCommError, а потом смотреть что в cs.
К твоему switch-case придраться не могу smile



--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
takedo
Дата 28.12.2005, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



на самом деле код был другой, это на скорую руку сделанная выдержка. Сейчас я делаю по другому, но попробую все-таки ещё раз. перед while естественно был вызов ClearCommError. В том и была проблема, что если сразу после прилетания символа в буфер(по эвенту отслеживаемому) ClearCommError возвращала 0 во входной очереди. И что самое главное, так это то, что в нескольких форумах я находил то же самое, поэтому не думаю, что заковыка здесь именно в приведенном неправильном коде. Но попробую, попробую.

JoyEx А есть кусок текста из реально-работающей программы для работы с ком портом, где бы было реализовано чтение вот именно так: пришел символ, смотрим очередь, читаем из очереди количество байт, которое в данный момент там есть?
Добавлено @ 16:19
JoyEx если бы было именно так, то я бы сидел там вечно while(!cs.cbInQue); => не в этом проблема!


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
takedo
Дата 28.12.2005, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



чего то запутал smile даже если и сначала while(!InQuene) ну тогда заходим и смотрим сколько в очереди, именно поэтому и появился этот while (вспомнил как на самом деле было smile )!, потому что если без цикла просто вызывая ClearCommError получал я 0! Вот какая была проблема. И ничего смешного, между прочим, просто не все с этим сталкиваются
Добавлено @ 16:36
JoyEx
я же и писал в ПЕРВОМ посте:
Цитата
Так вот не сразу меняется значение параметра cs.cbInQue!! Поэтому приходится делать дурацкую while!!!.

Добавлено @ 16:40
JoyEx
Цитата
сначало надо ClearCommError, а потом смотреть что в cs.
К твоему switch-case придраться не могу
Сначала while, а потом ClearCommError. Таким образом гарантированно заходим в while и считываем размер очереди.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
takedo
Дата 28.12.2005, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



JoyEx
Цитата
MSDN:

Цитата 
EV_RXCHAR  - A character was received and placed in the input buffer. 


хоть один байт значит получен
Да это точно, но если сразу смотреть размер очереди, не всегда он там отображается! Именно поэтому я и спрашивал и тему создал, чтобы узнать почему событие поймали, а очередь не изменилась. А особенно ярко эта проблема проявляется, если читать более 500 байт, потому что тогда точно при таком алгоритме придется делать несколько вызовов ReadFile. А вот когда у нас в очередь добавляются символы и одновременно убираются через ReadFile - получаем неактуальные значения InQue. Если использовать синхронное чтение и читать до упора, пока ReadFile не возвратит что-нибудь (хотя бы байт)то проблемы нет.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
JoyEx
Дата 28.12.2005, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



takedo

В прошлой теме я дал рабочий код.
Всё что ты пишешь интересно, конечно, но изложение не подсунешь компилятору.



--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
takedo
Дата 29.12.2005, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



JoyEx
надо сказать, что по теме заданного вопроса ты ничего не прояснил, но и на том спасибо.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.