Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Чтение из COM порта |
Автор: Nil 16.6.2007, 21:46 | ||
Здравствуйте. Ответа именно на мои вопросы не нашел, поэтому все же решил создать новую тему.
Таким образом открываю порт для чтения/записи. Есть следующие проблемы: 1) Если сразу после записи в порт начаь читать из него, то получу только что записанную строку, что не очень удобно, как бороться ? Как правильно читать ? 2) Можете пояснить на счет структуры COMMTIMEOUTS - какое поле за что отвечает ?.. ReadTotalTimeoutMultiplier - сколько макс. ждем одного символа ? ReadTotalTimeout - ? не совсем понял логику... ---------- Вообще требуется после того как записал в порт строку, ждать ответа в виде "ОК" максимально в течение 5 секунд, как это лучше реализовать ?.. |
Автор: Static 9.9.2009, 08:42 | ||
Это, конечно, староватый топик, но наиболее подходящий... Есть у меня задача - подключить электронные весы к компу. Пока весы фиг знает где стоят, решил потренироваться на чем-нить еще - никогда с com не работал. Нашел модем. И... я, наверно, делаю что-то не так. Если с модемом связаться через гипертерминал, например, - все ок: пишем AT - получаем OK. Ну и т.п. А вот прога, которую я наваял, получает только эхо :( Перерыл дофига всего - везде все (на первый взгляд) идентично, даже в исходниках другого терминала, который тоже работает нормально. Мой код:
Подозреваю, что-то элементарное забыл/не сделал/не знал. Подскажите, пожалуйста. |
Автор: GremlinProg 9.9.2009, 09:53 |
некрофилия, конечно у нас не в почете, но поскольку вопрос привязан только к названию темы... для AT-команд, думаю, это элементпрное - символ перевода строки в конце команды, т.е. "\r" или "\n" или "\r\n" |
Автор: Static 9.9.2009, 10:05 | ||||
да пробовал... было и вот так:
и вот так:
никакой разницы. Может еще вариант подкинете? |
Автор: GremlinProg 9.9.2009, 10:15 | ||||
так будет логичнее:
Добавлено через 55 секунд это можно не добавлять:
это просто для красоты ) |
Автор: Static 9.9.2009, 10:44 |
ну, видать, не красота спасет мир... То же только в профиль. Передается "AT\r\n" - это точно. А принимается только эхо. Т.е. точно то же, что и послали. Может я неправильно делаю ReadFile? |
Автор: GremlinProg 9.9.2009, 11:01 |
для теста сойдет, а в гипертерминале то же самое? или ОК все же приходит? если и там не приходит, смотри документацию к модему, тут может потребоваться перевод модема в командный режим "+++", вобщем, это уже специфка конкретного модема |
Автор: Static 9.9.2009, 11:20 | ||
Проблема где-то в моем коде... |
Автор: xvr 9.9.2009, 11:33 |
'ОК' придет, но позже - модем довольно медленное устройство, а уж COM порт и подавно ![]() Стоит разобраться как работает модем с COM портом - Когда в модем передают символы (те самые AT), он их отправляет назад (так же посимвольно) - таким образом получается эхо (сам по себе COM порт эхо НЕ ОБЕСПЕЧИВАЕТ!) Когда модеи получает символ CR ('\r'), он начинает выполнять команду, ПОСЛЕ чего посылает ответ. Рекомендую перед ReadFile поставить Sleep(500) - должно хватить для приема ответа |
Автор: Static 9.9.2009, 11:36 |
Спасибо за подсказку... Сейчас попробую. |
Автор: GremlinProg 9.9.2009, 11:39 | ||
ну да, а может и Get/SetCommState возвращаются с ошибкой, т.к. DCB инициирован неправильно, тут пропущена по крайнеймере установка длины структуры:
|
Автор: Static 9.9.2009, 11:43 |
Нет... это не то. Да и в гипретерминале модем почти мгновенно отвечает. Даже Sleep(5000) не решает. Я правильно понимаю, что полученные данные никуда не деваются, а спокойно лежат в буфере? И ReadFile их просто оттуда достает?.. Может модем просто не понимает, что я ему команду отправил? Кодировка или еще что-нить может не совпадать? Добавлено через 4 минуты и 40 секунд Ошибок ни то, ни другое не возвращает. И, насколько я понимаю, получив структуру при помощи GetCommState, длину ей задавать уже не надо. В лбом случае - явное задание ничего не решает. |
Автор: GremlinProg 9.9.2009, 11:52 |
поставь проверки на все вызовы, тогда возможно будет понятно где проблема |
Автор: Static 9.9.2009, 12:44 |
ок. Только какие проверки? Единственный вызов write/read проверять? |
Автор: smoke_man 9.9.2009, 13:32 |
Посмотри http://forum.vingrad.ru/index.php?showtopic=234366&view=findpost&p=1690295 может поможет. |
Автор: Static 9.9.2009, 14:18 |
Пример не помог. Ибо если его скопипастить - получается то же самое. Но елки-ж-палки! Терминал-то работает!!! |
Автор: smoke_man 9.9.2009, 15:41 | ||
Вот пример - проверил на своем модеме.
Успешно работает. Картинка прилагается. |
Автор: Static 9.9.2009, 15:56 |
Спасибо за пример. А теперь внимание (барабанная дробь). У меня с этим кодом НИ-ЧЕ-ГО не поменялось. Что может быть не так кроме кода? Настройки проекта, подключаемые либы, качество кожи на бубне? Добавлено через 4 минуты и 34 секунды так... я добился от модема ответа. Пока не понял, как именно ![]() |
Автор: Static 9.9.2009, 16:15 |
Проблема все же была в недоинициализированной структуре dcb. Вот так... :( |