Russian Qt Forum
Ноябрь 22, 2024, 18:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt и USB  (Прочитано 13397 раз)
andi
Гость
« : Июнь 05, 2006, 05:06 »

Пишу приложенеи под Qt. Приложение общается с USB-устройством через драйвер и с++библиотеку-оболочку. Основная операция это запрос данных от устройства. Используется обычный вызов read(). За один раз считывается  от 10 до 100 кб. Обычно после первого считывания, происходит зависание USB-подсистемы. Иногда очень редко это происходит после 2-3 считывания данных.
Для любопытствующих могу сказать, что ошибка проявляется таким образом: После считывания данных из драйвера, при завершении URB происходит вызов completion handler. Это стандартное поведение любого USB-драйвера. Так вот, при заходе в него обнаруживается, что urb->status = -104.
В "linux device drivers 3th" дается описание этой ошибки:
-ECONNRESET
The urb was unlinked by a call to usb_unlink_urb, and the transfer_flags variable of the urb was set to URB_ASYNC_UNLINK.
Получается, что кто-то командует отключить URB.
Но я эту команду не даю.

Можно конечно предположить, что виновата железка-драйвер-библиотека, но аналогичное(по функционалу) консольное приложение работает безупречно.
Отсюда я допускаю мысль, что Qt на каком то этапе вмешивается в работу USB-подсистемы. Кто что думает по этому поводу?
Что имеется:
slackware 10.2
kernel 2.4.31
Qt 3.3.4
Устройство работает через usb 1.0 (Внешний модкль вводы вывода E14-140, производство L-Card, www.lcard.ru)
Записан
Dair
Гость
« Ответ #1 : Июнь 06, 2006, 09:12 »

Цитата: "andi"
В "linux device drivers 3th" дается описание этой ошибки:
-ECONNRESET
The urb was unlinked by a call to usb_unlink_urb, and the transfer_flags variable of the urb was set to URB_ASYNC_UNLINK.
Получается, что кто-то командует отключить URB.
Но я эту команду не даю.

Совсем нигде в приложении?.. А по завершении работы?

Цитата: "andi"

slackware 10.2
kernel 2.4.31
Qt 3.3.4


Думается, где-то сносит крышу при работе с драйвером и многопоточностью. Если у тебя Qt-приложение не заточено под многопоточность, попробуй пересобрать под один поток.


Или, может, воспользоваться имеющимися в Qt средствами типа QIODevice/QFile/QDataStream?
Записан
andi
Гость
« Ответ #2 : Июнь 06, 2006, 09:22 »

Понятно что в конце есть вызов закрыть устройство и т д.

Приложение слинкованно с многопоточностью. Попробую отключить...

Насчет использования QDataStream...
Не пойму в чем может быть выйгрыш от использования этих компонент?

Спасибо что откликнулись.
Записан
Dair
Гость
« Ответ #3 : Июнь 06, 2006, 09:43 »

Выигрыш может быть в том, что они заточены под многопоточность.
Хотя я сам лично QFile/QDataStream недолюбливаю - тоже всё read()... :-)

Напиши лучше, помогла ли пересборка под один поток - интересно же (у меня тоже есть работа с USB  из-под Qt)
Записан
andi
Гость
« Ответ #4 : Июнь 06, 2006, 09:54 »

Пересобрал приложение без многопоточности.
Эффекта не последовало.

добавлено спустя 2 минуты:

 Вобщем залез в модули ядра отвечающие за usb. Нашлепал там диагностических сообщений. Сижу разбираю дамп.
Буду искать кто посылает команду на отключение urb.
Записан
Dair
Гость
« Ответ #5 : Июнь 06, 2006, 10:11 »

А если в качестве теста попробовать читать не из девайса, а с stdin? Или надо в обе стороны?

(можно ко мне в аську стукнуться, 27135449, чтобы тут флейм не разводить)
Записан
andi
Гость
« Ответ #6 : Июнь 06, 2006, 10:30 »

stdin не поможет.
у меня есть исходники драйвера железяки. Я точно вычленил на каком этапе происходит затык с какими симптомами.
Вообще чтение из устройства по сути своей примитивно до безобразия.
Происходит банальное копирование данных из буфера драйвера в указатель пользователя. Когда в буфере заканчиваются данные дергается прерывание, на предмет качнуть данные из устройства. Вот и все.
Пошел к тебе в аську
Записан
andi
Гость
« Ответ #7 : Июнь 07, 2006, 07:43 »

Вобщем после совещания с товарищами и нескольких консольных тестов.
Пришел к выводу что скорей всего кривой драйвер.
Соответственно с qt подозрения пока сняты.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #8 : Июнь 07, 2006, 21:19 »

у меня на qt тоже были подозрения при USB+webcamera

оказалось проблема в пропускной способности UBS шины
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.083 секунд. Запросов: 22.