![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| programmaker |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 30.10.2008 Репутация: нет Всего: нет |
Есть задача и я никак не могу ее решить.
исходные данные: Есть один ком порт. К нему подключен ЖПС модем. Есть удаленное устройство. К непу подключен такой же модем. Задача с моим алгоритмом решения: 1. Открываем порт 2. Пишем в него команду соединения модемов 3. Ждем пока модем ответит "коннект" 4. Закрываем порт 5. Открываем его же, но с другими параметрами 6. Программа работает в штатном режиме (до появления модемов все работало отлично - при прямом подключении компа и девайса). вот код (сверху вниз) а) Поток в котором происходит анализ работы порта до соединения модемов
б)инит
в)работа порта в режиме "пока соединение не установлено"
г) новое открытие порта с новыми параметрами
если я избавляюсь от потока, то все работает, но программа висит до установления коннекта, а это недопустимо в той последовательности, которая поисана выше (код) при закрытии порта и новом открытии хендл открытого порта меняется я так понимаю, что проблемма именно в этом, но как ни бьюсь - не выходит у меня каменный цветок. подскажите что я не так делаю ато надоело оправдываться и говорить, что вот вот все будет готово |
||||||||
|
|||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Хэндл конечно меняется, но непонятно, почему это должно мешать?
Еще непонятно зачем надо переоткрывать порт? Если только для включения OVERLAPPED режима, то это лишнее - можно его включить сразу. И самое главное, непонятно что именно не работает? |
|||
|
||||
| programmaker |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 30.10.2008 Репутация: нет Всего: нет |
именно для включения оверлапед режима. я делаю: 1. открытие порта 2. запись в порт (atd*******) 3. чтение из порта пока не прийдет ответ о подключении 4. закрытие порта 5. открытие порта в штатном режиме (с оверлаппедом) если в потоке - не срабатывает ивент на чтение-запись если без потока, то срабатывает как поток на это повлиял? |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Включите OVERLAPPED сразу, и не надо ничего переоткрывать
|
||||
|
|||||
| programmaker |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 30.10.2008 Репутация: нет Всего: нет |
Вот полный код именно этого девайса.
(без модемов) Добавлено через 6 минут и 54 секунды С этим кодом при прямом подключении девайса к компу обмен идет автоматически (там в ядре программы черт ногу сломит, но работает). Если добавляю модемную часть без потока - тоже идет, но программа висит до коннекта модемов. Если добавляю модемную часть в потоке - не идет обмен между девайсом и компом (открытый второй раз порт не реагирует на ивенты). Если пытаюсь просто открыть порт и записать в него что-то - выдает ошибку (какую уже и не помню). Слишком долго я с этим бьюсь. Присоединённый файл ( Кол-во скачиваний: 7 )
DevComm.cpp 6,87 Kb |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
В сорце не нашел собственно ожидания на m_osRead.hEvent, где то оно спрятанно. Вот видимо там и отвалилось
И еще - если на момент вызова ReadFile в буфере будут данные, то они могут быть немедленно возвращены из ReadFile'а, и евент вообще не взведется. Так что вот тут -
Добавлено через 1 минуту и 31 секунду Кстати, обнулять timeout'ы тоже не стоит - будет немедленно возвращаться с пустым буфером |
|||
|
||||
| programmaker |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 30.10.2008 Репутация: нет Всего: нет |
как поток мог повлиять на работу с портом?
без потока ведь все работает... |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Введением дополнительной задержки перед ReadFile (на время создания потока и его запуск). От порта уже успело что то придти, и ReadFile завершился немедленно (и успешно). На что ваша программа не расчитанна
|
||||
|
|||||
| programmaker |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 30.10.2008 Репутация: нет Всего: нет |
Перед ReadFile от порта ничего не приходит. К порту подключен модем, который первый ответ дает секунд через 7-10 после WriteFile. После ReadFile порт закрывается и открывается заново с OVERLAPPED режимом. |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Бесы! Попробуй все же проверять, что возвращает ReadFile. Других дыр пока не вижу |
|||
|
||||
| programmaker |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 30.10.2008 Репутация: нет Всего: нет |
dw= 1, что означает "Неверная функция" как это может быть и что с этим сделать надо? |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
||||
|
||||
| programmaker |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 30.10.2008 Репутация: нет Всего: нет |
извиняюсь за грубость, но В РОТ МНЕ НОГИ!!!
изменил инит девайс на
и все заработало но
вешает программу до появления события. можно ли как-нибудь от этого избавиться? |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
||||
|
||||
| programmaker |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 30.10.2008 Репутация: нет Всего: нет |
А если я избавлюсь от wait..., то как мне отследить приход по readfile? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Запусти ВСЕ общение с портом в отдельном потоке (не в разных, а в одном и том же). Пусть там сначала ждет ответа от модема в блокирующем ReadFile, а потом переключается на OVERLAPPED чтения |
|||
|
||||
| programmaker |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 30.10.2008 Репутация: нет Всего: нет |
Еще раз переделал все и решил остаться на одном открытии порта с оверлаппедом.
Появилась проблема. Код, который был:
После моего вмешательства стало:
При выполнении моего кода возникает ошибка 997 (Протекает наложенное событие ввода/вывода.) и запись не происходит. Как это побороть??? |
||||
|
|||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Кстати, перед вызовом WriteFile рекомендуется событие сбросить вручную, WriteFile этого не делает |
||||
|
|||||
| programmaker |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 30.10.2008 Репутация: нет Всего: нет |
Несмотря на ошибку 997 - запись и чтение проходит нормально...
Странно конечно, но проходит... есть вопрос по таймеру (чтоб уж не создавать новую тему - в существующих не нашел :( )
в OnTimer1 - не заходит |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
если SetTimer вызывается в потоке, то в нем должен быть реализован в каком-нить виде цикл обработки сообщений, ну и соответственно сама очередь, чтобы OnTimer1 мог быть вызван
SetTimer просто привязан к очереди сообщений, как вариант - использовать Waitable Timer, или просто другой поток -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| programmaker |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 30.10.2008 Репутация: нет Всего: нет |
SetTimer вызывается в основной программе (основной поток), CALLBACK - просто глобальная ф-ция |
|||
|
||||
| programmaker |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 30.10.2008 Репутация: нет Всего: нет |
заменил SetTimer на timeSetEvent
теперь когда я пытаюсь поменять переменную в CallBack функции выдает ошибку error C2597: illegal reference to non-static member 'CCommModemDevice::modTerm' вот код
как ее побороть? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
||||
|
||||
![]()
|
| Правила форума "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. |