QSerialDevice - Библиотека для работы с COM-портами |
Здравствуйте, гость ( Вход | Регистрация )
QSerialDevice - Библиотека для работы с COM-портами |
kuzulis |
6.11.2011, 16:46
Сообщение
#281
|
Активный участник Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: 7 |
Добрый день. Обновился до ветки master от 17 сентября. На windows 7 не закрывает порт с модемом, который подключен по USB. Так и висит с открытым портом, до тех пор пока шнурок из модема не выдернешь. В чем может быть проблема? спасибо. P.S. под USB модемом подразумеваю zyxel OMNI 56K UNO, а не всякие GPRS/3G. Не знаю, проверьте сами дебаггером. |
|
|
silver47 |
6.11.2011, 19:10
Сообщение
#282
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: 6 |
Дебаггер встал на файле abstractserial.cpp На строке номер 800
Если копать глубже, то в файле nativeserialengine_win.cpp на строке 176
Прилагаю скриншот. P.S. если выдернуть девайс в этот момент, то сразу же переходим к строке 178
Сообщение отредактировал silver47 - 6.11.2011, 19:14 |
|
|
kuzulis |
6.11.2011, 21:05
Сообщение
#283
|
Активный участник Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: 7 |
Можно попробовать перед закрытием делать setFlowControl(FlowControlOff) или,
если не получится, закомментировать CancelIo(). |
|
|
silver47 |
7.11.2011, 6:08
Сообщение
#284
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: 6 |
Цитата Можно попробовать перед закрытием делать setFlowControl(FlowControlOff) Порт открывается с FlowControlOff, тем не менее, поставил вызов прямо перед закрытием порта - результат нулевой. Закомментировал вызов ::CancelIO(this->descriptor); гм... тоже без результата. Может чего не так делаю, но деббагер упорно переходит на строку с комментом. Уже вычистил проект и пересобрал, все равно. UPDATE:Прошу прощения, спросонья подумал что сегодня уже 8е число, и что это уже пересобранная библиотека, а оказалась что исходники поменял, а саму библиотеку QSerialDevice не перекомпилил. Все работает. Спасибо. Сообщение отредактировал silver47 - 7.11.2011, 6:28 |
|
|
sarge |
7.11.2011, 14:54
Сообщение
#285
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 7.11.2011 Пользователь №: 2985 Спасибо сказали: 0 раз(а) Репутация: 0 |
Добрый день, сори за идиотские вопросы, но с qt столкнулся впервые и пытаюсь разобраться с работой с ком портом.
суть такова - имеется qt SDK, пишу в нем простые программки, все работае. Скачал qserialdevice и попытался собрать примеры оттуда - в результате куча ошибок, попробовал собрать библиотеку (как описано в ридми) тоже куча ошибок. мне надо как то по другому установить Qt чтобы все работало? |
|
|
kuzulis |
7.11.2011, 18:08
Сообщение
#286
|
Активный участник Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: 7 |
[/telepaty mode = ON]
См тут ответ. Или тут на форуме или на prog.org.ru [/telepaty mode] Сообщение отредактировал kuzulis - 7.11.2011, 18:09 |
|
|
sarge |
7.11.2011, 20:48
Сообщение
#287
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 7.11.2011 Пользователь №: 2985 Спасибо сказали: 0 раз(а) Репутация: 0 |
[/telepaty mode = ON] См тут ответ. Или тут на форуме или на prog.org.ru [/telepaty mode] если честно то не ожидал что тут ответят, т.к. сообщение набирал с полной мешаниной в голове и уже подготовил файлы и подробный пост на этот форум, но тут появились вы спасибо большое, пока что все работает |
|
|
shurilnik |
7.12.2011, 18:36
Сообщение
#288
|
Студент Группа: Новичок Сообщений: 10 Регистрация: 12.8.2011 Пользователь №: 2804 Спасибо сказали: 0 раз(а) Репутация: 0 |
kuzulis, Приветствую!
Наконец опять занялся своим устройством, сижу пытаюсь разобраться почему SerialDeviceEnumerator грузит проц... Пока что выяснил вот что: в функции void SerialDeviceEnumeratorPrivate::setEnabled(bool enable) создается коннект: q->connect(this->notifier, SIGNAL(activated(int)), q, SLOT(_q_processWatcher())); И в общем-то все нормально пока не воткнешь usb устройство. После вставки (или доставания, если сабжевый класс был инициализирован при воткнутом устройстве) начинаются бесконечные ивенты от этого QSocketNotifier (который udev_socket). И он постоянно дергает _q_processWatcher() и получается загрузка проца по плешку. Пробовал на десктопе у себя - тоже самое. только грузится одно ядро (ну есесно прога а один поток работает). Насколько я понимаю QSocketNotifier должен выдавать сигнал только когда udev увидел что действительно устройство появилось/исчезло? А оно почему-то выдает постоянно. PS: Это все происходит вообще без участия AbstractSerial. Т.е. порт я даже не откываю. Может есть идеи отчего так происходит ? О, а может сокет не читается, поэтому сигнал все время заново посылается ? |
|
|
kuzulis |
7.12.2011, 20:05
Сообщение
#289
|
Активный участник Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: 7 |
Цитата После вставки (или доставания, если сабжевый класс был инициализирован при воткнутом устройстве) начинаются бесконечные ивенты от этого QSocketNotifier (который udev_socket). Да, есть такое дело. Если открыть порт и выдернуть шнурок то будут евенты сыпаться и будет загрузка. Тут эта тема поднималась уже. Решения нет и не будет в принципе, т.к. эта ветка библиотеки заморожена и больше не поддерживается. Вместо этой ветки используй 2.0. : https://gitorious.org/qserialdevice/qserial...ive-tarball/2.0 которую (тьфу-тьфу чтобы не сглазить), нокиевцы обещали добавить в Qt как аддон. Здесь вместо SerialDeviceEnumerator использовать можно SerialPortInfo с проверкой портов по таймеру. |
|
|
shurilnik |
7.12.2011, 20:19
Сообщение
#290
|
Студент Группа: Новичок Сообщений: 10 Регистрация: 12.8.2011 Пользователь №: 2804 Спасибо сказали: 0 раз(а) Репутация: 0 |
Цитата После вставки (или доставания, если сабжевый класс был инициализирован при воткнутом устройстве) начинаются бесконечные ивенты от этого QSocketNotifier (который udev_socket). Да, есть такое дело. Если открыть порт и выдернуть шнурок то будут евенты сыпаться и будет загрузка. Тут эта тема поднималась уже. Решения нет и не будет в принципе, т.к. эта ветка библиотеки заморожена и больше не поддерживается. Это я читал, но как я выше написал порт вообще не открывается. Т.е. проблема даже при неоткрытом порте, я инициализирую только класс SerialDeviceEnumerator, AbstractSerial я не трогаю... Он же сам не открывает порт при появлении устройства.... Смысл как я понял в том что на udev_motitor вешается QSocketNotifier который выдает событие что данные можно читать, а обработчик из этого сокета ничего не читает а запускает сразу udev_enumerator и уже из него читает. добавление struct udev_device *udev_device =::udev_monitor_receive_device(this->udev_monitor); в обработчик решает проблему, но эта функция блокирующая и есть свои нюансы. Я до конца механизм еще не понял (мало знаний, начинающий я...), но попробую как-нибудь всетаки красиво это решить. Вместо этой ветки используй 2.0. : https://gitorious.org/qserialdevice/qserial...ive-tarball/2.0 которую (тьфу-тьфу чтобы не сглазить), нокиевцы обещали добавить в Qt как аддон. Здесь вместо SerialDeviceEnumerator использовать можно SerialPortInfo с проверкой портов по таймеру. Эта ветка считается более стабильной ? Спасибо, посмотрю, хотя если б ту доделать то в общем-то все красиво получалось... а по таймеру не всегда удобно в embedded системе ресурсы дороги... |
|
|
Текстовая версия | Сейчас: 11.12.2024, 13:53 |