![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
Вот заковыка та какая:
после того, как определяется, что в буфер поступил символ (порт инициализирован так например SetCommMask(m_hComm,EV_RXCHAR);), запрашиваем, сколько же у нас во входной очереди символов имеется через ClearCommError. Так вот не сразу меняется значение параметра cs.cbInQue!! Поэтому приходится делать дурацкую while!!!. А как иначе??? Может есть где там каккой-то скрытый Event??? Вот пример кода:
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
Блин, так ни у кого никаких мыслей что-ли по поводу того как после выполнения асинхронного вызова WaitCommEvent гарантированно получить актуальное значение cs.cbInQue ???
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
А почему ты не проверяешь dwCommEvent на EV_RXCHAR?
-------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
JoyEx
А что это поменяет? Если я поставлю условие if(dwCommEvent & EV_RXCHAR){ClearCommError();...}, то я все равно на очередь не повлияю, в том то и дело, что (dwCommEvent & EV_RXCHAR) == true, а очередь равна нулю. -------------------- я не гольфист - я хоккеист |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
takedo
Не надо "влиять на очередь", ею занимается \Device\Serial0-1. Ты просто проверь не нуль ли в dwCommEvent. -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
JoyEx
Все равно не понятно, ну проверю - нуль, дальше по логике опять WaitCommEvent(), но событие уже взвелось и если новых символов не прилетит, то я вылечу по таймауту, то есть с ошибкой(по крайне мере у меня так было), а на самом деле пришел правильный кадр. Тут ведь вот в чем дело, может я чего недопонимаю, но когда приходит символ в потр, выставляется в "свободен" m_ovp_wait.hEvent, а очередь в этот момент равна 0 (не всегда, а когда поместил в буфер часть кадра, ту длина которой была в cbInQue)! Как это связано с проверкой dwCommEvent на EV_RXCHAR? НУ НЕПОНЯТНО! -------------------- я не гольфист - я хоккеист |
|||
|
||||
| JoyEx |
|
||||||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
1)
нет. m_ovp_wait у тебя для того, чтобы ждать завершения работы WaitCommEvent(), ты же сам проверяешь на PENDING. 2) Смотри выше п.1, про m_ovp_wait =================== MSDN:
хоть один байт значит получен
сначало надо ClearCommError, а потом смотреть что в cs. К твоему switch-case придраться не могу -------------------- Если ты уже никого не боишься, значит ты самый страшный |
||||||
|
|||||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
на самом деле код был другой, это на скорую руку сделанная выдержка. Сейчас я делаю по другому, но попробую все-таки ещё раз. перед while естественно был вызов ClearCommError. В том и была проблема, что если сразу после прилетания символа в буфер(по эвенту отслеживаемому) ClearCommError возвращала 0 во входной очереди. И что самое главное, так это то, что в нескольких форумах я находил то же самое, поэтому не думаю, что заковыка здесь именно в приведенном неправильном коде. Но попробую, попробую.
JoyEx А есть кусок текста из реально-работающей программы для работы с ком портом, где бы было реализовано чтение вот именно так: пришел символ, смотрим очередь, читаем из очереди количество байт, которое в данный момент там есть? Добавлено @ 16:19 JoyEx если бы было именно так, то я бы сидел там вечно while(!cs.cbInQue); => не в этом проблема! -------------------- я не гольфист - я хоккеист |
|||
|
||||
| takedo |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
чего то запутал
Добавлено @ 16:36 JoyEx я же и писал в ПЕРВОМ посте:
Добавлено @ 16:40 JoyEx
-------------------- я не гольфист - я хоккеист |
||||
|
|||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
JoyEx
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
takedo
В прошлой теме я дал рабочий код. Всё что ты пишешь интересно, конечно, но изложение не подсунешь компилятору. -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
JoyEx
надо сказать, что по теме заданного вопроса ты ничего не прояснил, но и на том спасибо. -------------------- я не гольфист - я хоккеист |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |