crossplatform.ru

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

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


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

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

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




Репутация:   7  


Цитата
На самом деле я пробовал и без открытия порта - тоже самое происходит. Я serialenumerator и использую для отслеживания что устройство выдернули, (даже с открытым портом) и соответствующий ему Abstractserial класс удаляется с закрытием порта и удалением дескриптора.

Ну, если вы говорите, что ошибка в serialenumerator - значит нужно его ковырять.
Я не скажу навскидку что там происходит... Может udev шалит, а мож еще что.

PS: А на обычном PC с Linux пробовали?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sh2ka
  опции профиля:
сообщение 17.8.2011, 12:53
Сообщение #272


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 23.2.2011
Пользователь №: 2437

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




Репутация:   0  


Есть некоторая проблема при использовании QSerialDevice.

Вот, исходные данные:
  • графическое приложение Qt (QWidget)
  • объект открытого порта (QSerialDevice)
  • фоновый таймер, отправляющий в порт запросы с интервалом ~1 секунду
  • есть слейв устройство, которое отправляет ответы на запросы (ГАРАНТИРОВАННО)


шаги по воспроизведению:
  • хватаю окно мышью за заголовок и держу
  • или открываю модальное окно


ПРОБЛЕМА: прекращается обмен с устройством.

Проверил, работает ли в этой ситуации таймер запросов - оказалось, что работает, т.е. запросы идут (проверял с помощью разных терминалок) - на стороне слейва данные приходят и отправляется ответ, но он не приходит мастеру.

Думаю, что здесь что-то связано с использованием API-функции WaitForSingleObject, т.е. она не возвращает управление до тех пор, пока не отпустишь окно или не закроешь модальное окно.

Однако, это всего лишь мое предположение. Хотелось бы узнать, что на самом деле: я что-то не так делаю или это баг?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 17.8.2011, 15:16
Сообщение #273


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

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

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




Репутация:   7  


Да, подтверждаю. Есть такое дело.

По ходу блокируется метод: QWinEventNotifier::event(QEvent *e).
т.е. не блокируется - а перестает срабатывать при появлении события.

Цитата
Думаю, что здесь что-то связано с использованием API-функции WaitForSingleObject, т.е. она не возвращает управление до тех пор, пока не отпустишь окно или не закроешь модальное окно.

Хз в какой функции проблема - но точно она в QWinEventNotifier.
В этом случае я ничего не могу сделать. ИМХО.

Создавайте экземпляр класса порта тогда в другом потоке, может поможет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.8.2011, 8:14
Сообщение #274


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(sh2ka @ 17.8.2011, 15:53) *
хватаю окно мышью за заголовок и держу
В виндовозе главный поток сразу блокируется, поэтому коммуникационную часть нужно делать в отдельном окне
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 18.8.2011, 8:21
Сообщение #275


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

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

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




Репутация:   7  


Цитата(Litkevich Yuriy @ 18.8.2011, 9:14) *
В виндовозе главный поток сразу блокируется, поэтому коммуникационную часть нужно делать в отдельном окне

Эмм... но если б он блокировался - то не срабатывал бы таймер и не излучался бы от него сигнал, по которому порт отправляет данные.
Но в данном случае порт их периодично (раз в 1 сек) отправляет, но вот обратно не принимает ответ!

Почему тогда срабатывает таймер и обрабатываются евенты, если гл. поток должен блокироваться!?

Сообщение отредактировал kuzulis - 18.8.2011, 8:22
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.8.2011, 12:33
Сообщение #276


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


у меня и таймер не срабатывает, отпущу мыша, и попёрла вся пачка накопившаяся в очереди.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 18.8.2011, 14:34
Сообщение #277


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

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

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




Репутация:   7  


Цитата(Litkevich Yuriy @ 18.8.2011, 13:33) *
у меня и таймер не срабатывает, отпущу мыша, и попёрла вся пачка накопившаяся в очереди.

Хм, странно. У меня таймер срабатывает (WinXP SP2). :blink:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sh2ka
  опции профиля:
сообщение 19.8.2011, 6:56
Сообщение #278


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 23.2.2011
Пользователь №: 2437

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 18.8.2011, 14:33) *
у меня и таймер не срабатывает, отпущу мыша, и попёрла вся пачка накопившаяся в очереди.


Странно, у меня таймер подвисает на долю секунды пока рамочка вокруг окна отрисовывается (содержимое окна при перетаскивании не отрисовывается), а потом все нормально.

Аналогично с полями ввода (скорее всего там таймер и используется для моргания курсора).
Одно понять не могу: это баг виндовс или Qt? Может какие-то особые настройки нужны системе для генерации события от порта (прерывания-то должны возникать хоть как при получении данных в порт)?

Я программировал на чистом WinAPI одно время и сам делал модальные циклы - это обычный рекурсивный вызов бесконечного цикла обработки событий, который закрывается при закрытии модального окна. Исходя из этого непонятно, почему блокируется генерация событий от порта. С отдельным потоком не всегда удобно, когда нужно сделать быстро и без проблем примитивную програмку с модальными окнами.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 19.8.2011, 9:19
Сообщение #279


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

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

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




Репутация:   7  


Цитата(sh2ka @ 19.8.2011, 7:56) *
Одно понять не могу: это баг виндовс или Qt?

ИМХО - баг Qt, связанный с обработкой событий (или типа того, не охота копать глубоко).

Вот, я прикрепил небольшой тестовый примерчик где по таймеру раз в 1 сек в порт отправляется запрос на чтение регистров (Modbus) и принимается ответ. Так тут такое же поведение.

Сообщение отредактировал kuzulis - 19.8.2011, 9:21
Прикрепленные файлы
Прикрепленный файл  testserialreadyread.zip ( 4.76 килобайт ) Кол-во скачиваний: 140
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 4.11.2011, 14:41
Сообщение #280


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

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

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




Репутация:   6  


Добрый день. Обновился до ветки master от 17 сентября. На windows 7 не закрывает порт с модемом, который подключен по USB. Так и висит с открытым портом, до тех пор пока шнурок из модема не выдернешь. В чем может быть проблема?

спасибо.

P.S. под USB модемом подразумеваю zyxel OMNI 56K UNO, а не всякие GPRS/3G.

Сообщение отредактировал silver47 - 4.11.2011, 14:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 19.4.2024, 4:42