crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

44 страниц V  « < 27 28 29 30 31 > »   
Ответить в данную темуНачать новую тему
> QSerialDevice - Библиотека для работы с COM-портами
kuzulis
  опции профиля:
сообщение 6.11.2011, 16:46
Сообщение #281


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


Цитата(silver47 @ 4.11.2011, 15:41) *
Добрый день. Обновился до ветки 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
d->serialEngine->close();
Если копать глубже, то в файле nativeserialengine_win.cpp на строке 176
::CancelIo(this->descriptor);


Прилагаю скриншот.

P.S. если выдернуть девайс в этот момент, то сразу же переходим к строке 178
if (0 == ::CloseHandle(this->descriptor)) {


Сообщение отредактировал 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  


Цитата(kuzulis @ 7.11.2011, 18:08) *
[/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  


Цитата(kuzulis @ 7.12.2011, 20:05) *
Цитата
После вставки (или доставания, если сабжевый класс был инициализирован при воткнутом устройстве) начинаются бесконечные ивенты от этого QSocketNotifier (который udev_socket).


Да, есть такое дело. Если открыть порт и выдернуть шнурок то будут евенты сыпаться и будет загрузка.
Тут эта тема поднималась уже.

Решения нет и не будет в принципе, т.к. эта ветка библиотеки заморожена и больше не поддерживается.

Это я читал, но как я выше написал порт вообще не открывается. Т.е. проблема даже при неоткрытом порте, я инициализирую только класс SerialDeviceEnumerator, AbstractSerial я не трогаю... Он же сам не открывает порт при появлении устройства....
Смысл как я понял в том что на udev_motitor вешается QSocketNotifier который выдает событие что данные можно читать, а обработчик из этого сокета ничего не читает а запускает сразу udev_enumerator и уже из него читает.
добавление struct udev_device *udev_device =::udev_monitor_receive_device(this->udev_monitor);
в обработчик решает проблему, но эта функция блокирующая и есть свои нюансы.
Я до конца механизм еще не понял (мало знаний, начинающий я...), но попробую как-нибудь всетаки красиво это решить.

Цитата(kuzulis @ 7.12.2011, 20:05) *
Вместо этой ветки используй 2.0. : https://gitorious.org/qserialdevice/qserial...ive-tarball/2.0
которую (тьфу-тьфу чтобы не сглазить), нокиевцы обещали добавить в Qt как аддон.

Здесь вместо SerialDeviceEnumerator использовать можно SerialPortInfo с проверкой портов по таймеру.

Эта ветка считается более стабильной ?
Спасибо, посмотрю, хотя если б ту доделать то в общем-то все красиво получалось... а по таймеру не всегда удобно в embedded системе ресурсы дороги...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

44 страниц V  « < 27 28 29 30 31 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2024, 3:23