Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: andi от Июнь 05, 2006, 05:06



Название: Qt и USB
Отправлено: 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)


Название: Re: Qt и USB
Отправлено: Dair от Июнь 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?


Название: Qt и USB
Отправлено: andi от Июнь 06, 2006, 09:22
Понятно что в конце есть вызов закрыть устройство и т д.

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

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

Спасибо что откликнулись.


Название: Qt и USB
Отправлено: Dair от Июнь 06, 2006, 09:43
Выигрыш может быть в том, что они заточены под многопоточность.
Хотя я сам лично QFile/QDataStream недолюбливаю - тоже всё read()... :-)

Напиши лучше, помогла ли пересборка под один поток - интересно же (у меня тоже есть работа с USB  из-под Qt)


Название: Qt и USB
Отправлено: andi от Июнь 06, 2006, 09:54
Пересобрал приложение без многопоточности.
Эффекта не последовало.

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

 Вобщем залез в модули ядра отвечающие за usb. Нашлепал там диагностических сообщений. Сижу разбираю дамп.
Буду искать кто посылает команду на отключение urb.


Название: Qt и USB
Отправлено: Dair от Июнь 06, 2006, 10:11
А если в качестве теста попробовать читать не из девайса, а с stdin? Или надо в обе стороны?

(можно ко мне в аську стукнуться, 27135449, чтобы тут флейм не разводить)


Название: Qt и USB
Отправлено: andi от Июнь 06, 2006, 10:30
stdin не поможет.
у меня есть исходники драйвера железяки. Я точно вычленил на каком этапе происходит затык с какими симптомами.
Вообще чтение из устройства по сути своей примитивно до безобразия.
Происходит банальное копирование данных из буфера драйвера в указатель пользователя. Когда в буфере заканчиваются данные дергается прерывание, на предмет качнуть данные из устройства. Вот и все.
Пошел к тебе в аську


Название: Qt и USB
Отправлено: andi от Июнь 07, 2006, 07:43
Вобщем после совещания с товарищами и нескольких консольных тестов.
Пришел к выводу что скорей всего кривой драйвер.
Соответственно с qt подозрения пока сняты.


Название: Qt и USB
Отправлено: Admin от Июнь 07, 2006, 21:19
у меня на qt тоже были подозрения при USB+webcamera

оказалось проблема в пропускной способности UBS шины