| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT4] Работа с библиотекой libusb |
| Автор: ISerg1986 14.1.2014, 11:28 | ||||
| Решил начать новую тему. Буду задавать свои вопросы тут, по мере их появления. Надеюсь, что тема будет многим полезна т.к. в сети крайне мало информации по работе с libusb. А на русском всего пару статей. Сейчас я пытаюсь написать простейшую программу, для работы с USB устройством, используя libusb. Ну и попутно, лучше разобраться в Qt. Из предыдущей темы Ни то, ни то. Судя по ошибке "undefined reference" компилятор уже закончил работу, а ошибку выдал линковщик, который не видит библиотеки libusb. Для того, чтобы он увидел добавь в .pro файл следующее
Если тебе не нужна кроссплатформенность, и нужен только linux, то можешь добавить просто
Вы написали libusb.lib. Но в архиве http://www.libusb.org/ (libusb-1.0.9 (2012-04-20)) такой библиотеки нет. Есть файлы с расширениями in, sub, ac, c, h, rc, def. Файлов с расширением lib нет. Может я не оттуда качал? |
| Автор: ISerg1986 14.1.2014, 12:32 | ||||
Очень мало примеров для новичков. Хотелось бы увидеть пошаговую статью. А английский я знаю, причём довольно не плохо. И технический тоже. 4 года спецкурсов.
Сделал. Получил библиотеку. Подключил. Но посыпались ошибки ( ![]() |
| Автор: borisbn 14.1.2014, 12:40 |
| Кажется ясно. Дело в том, что линковщик MinGW (а именно его запускает QtCreator) не понимает формата библиотек MSVC. Тебе нужно собрать libusb при помощи MinGW. Как именно сейчас не подскажу (я не знаю, и сейчас нет времени). Погугли "MinGW libusb" или "MinGW howto link library from linux configure make" или наподобие |
| Автор: kuzulis 14.1.2014, 15:52 |
| Эмм.. Вообще то в Windows есть стандартный драйвер WinUSB который позволяет работать с USB девайсами (гугл в помощь). Но с ограничением: невозможно иметь доступ к изохронным конечным точкам (по крайней мере вроде бы в Windows 8.1 это можно - там добавили эту фичу). И не нужно ничего компилить и libusb вообще не нужен (т.е. не удивлюсь если libusb работает через winusb, но я не уверен, нужно глянуть сорцы)... В Linux же достаточно установить пакет libusb из репозиториев.. и также не нужно ничего компилировать. Еще 5 копеек: работать с USB через libusb - это не очень хорошая идея, потому что большие накладные расходы и пр. фейлы. Это годится только для чего нить простого.. Для серьезных вещей лучше всего сделать собственный драйвер и работать через него. |
| Автор: ISerg1986 14.1.2014, 16:08 | ||||
| Конечно, не хорошо "скакать" с одной ОС на другую, но всё же... Ради эксперимента перенёс проект на Linux Debian. Добавил LIBS += -L/usr/local/lib -llibusb Снова ошибка ( не может найти llibusb Вы уверены в правильности написанного вами пути? Там, вроде, ничего нет. Но в установке/удалении программ этот пакет (пакеты) установлены. Или следует скачать и установить deb пакет вручную? (http://packages.debian.org/ru/sid/i386/libusb-1.0-0/download) Путь пробовал менять на /usr/local/lib -llibusb (ну а вдруг), не помогло. ![]()
Я новичек. Мне до драйвера-как до Луны. Хоть бы это заработало )
Хочется просто, быстро и на Линукс. В идеале. Но и на Виндовс тоже интересно. Вот и выбрал libusb. |
| Автор: borisbn 14.1.2014, 16:15 |
Абсолютно не уверен т.к. 1) Линукса вообще не знаю 2) Насколько, всё же, я знаю, в разных линуксах оно может лежать в разных местах и в проекте нужно писать не полный путь, а через переменную окружения (что-то типа $$LIBS или $$LIBPATH) 3) Опять же - предположение - у тебя установлен не SDK для libusb, а сама dll-ка (ну... so-шка в линуксе). Тебе же нужен пакет для разработчиков (SDK). Что-то типа libusb-dev |
| Автор: ISerg1986 14.1.2014, 16:32 | ||
Жаль. Буду пробовать методом научного тыка.
Команда sudo apt-get install libusb-dev говорит, что "Уже установлена самая новая версия libusb-dev". |
| Автор: bsa 14.1.2014, 16:42 | ||
| Для Linux ключ -L указывать не надо, если библиотека поставляется разработчиком дистрибутива (твой случай), находится в стандартном месте или указан полный путь к ней. Ключу же -l нужно передавать только часть названия библиотеки - без приставки lib и всех расширений. В твоем случае должно выглядеть так: LIBS += -lusb Добавлено через 2 минуты и 40 секунд
|
| Автор: Amp 14.1.2014, 16:53 |
Предлагаю попробовать методом поиска по файловой системе. Хотя результат будет немного предсказуем. |
| Автор: ISerg1986 14.1.2014, 17:02 | ||
Исправил. Ошибка http://s017.radikal.ru/i435/1401/a9/cd42bb054bc8.jpg Дело в том, что линковщик GCC не понимает формата библиотек? Следует сменить линковщик? http://i023.radikal.ru/1401/0a/afc11a3bd458.jpg
Ок. Я это делал для удобства. |
| Автор: bsa 14.1.2014, 17:54 |
| ISerg1986, на приведенном тобой скриншоте всего лишь есть ошибка отсутствия функции libusb_init, а не неверного формата библиотеки. Неверный формат бывает тогда, когда ты пытаешься прилинковать 32-х битную библиотеку к 64-х битной программе. |
| Автор: ISerg1986 14.1.2014, 18:34 |
Сейчас, при вводе в Qt " libusb_ " появляется выпадающий список, с множеством функций. Там есть libusb_init Такое может быть, при отсутствии функции libusb_init? И как это исправить? |
| Автор: tzirechnoy 14.1.2014, 19:08 |
| 1) Зачем Вам библиотеки в /usr/local? libusb ужэ много лет лежыт во всех дистрибутивах линукса. Если Вы не девелопер библиотеки libusb или хотя бы не экспериментируете с экспериментальными возможностями библиотеки -- то берите дистрибутивный вариант. 2) Указания на самые базовые примеры идут с оригинальной документацыей. libusb developers guide, раздел IV называется "Examples". |
| Автор: ISerg1986 14.1.2014, 19:51 | ||
Мне так посоветовали прописать путь. Сейчас изменил на LIBS += -lusb
Там совсем немного. http://libusb.sourceforge.net/doc/examples-code.html Я пытаюсь сделать следующее. http://clck.ru/92UeH Считать данные с устройства, зная vid и pid. Но на первой-же команде "libusb_init(NULL);", возникает ошибка. |
| Автор: bsa 14.1.2014, 23:17 |
| Ты используешь версию библиотеки 1.0. Она несовместима с 0.1, которая у тебя установлена в системе. Тебе необходимо установить пакет libusb-1.0.0-dev. А библиотеку задавать так: LIBS += -lusb-1.0 |
| Автор: tzirechnoy 14.1.2014, 23:50 | ||||
Как раз на следующей страницэ указано, где взять пример, который можэт просканировать все устройства и прочитать их дескрипторы (включая vid/pic/class/etc )
Как несложно заметить, в примере -- usb_init(), а не libusb_init(). Впрочем, действительно есть у libusb такая проблема: приличный developers guide -- под libusb-0.1, а сейчас типа стабильная версия -- libusb-1.0 Я бы для начала посоветовал именно на -0.1 и разрабатывать -- ну, она вполне работает, притом написано под неё большэ и кода и документацыи. Да, в Debian они присутствуют обе, -0.1 -- под именем просто libusb, а -1.0 -- под именем libusb-1.0 и libusb-1.0-0-dev. И собирать под -1.0 надо с -lusb-1.0 |
| Автор: ISerg1986 20.1.2014, 19:17 |
Спасибо, bsa за ваш ответ. Правда я это уже сделал раньше. Кроме того, до установки libusb-1.0.0-dev, мне пришлось поудалять всё, установленное из репозиториев. А я считал, что лучше всё ставить оттуда. Теперь команда libusb_init(NULL); не выдаёт ошибки. |
| Автор: bsa 20.1.2014, 19:56 | ||
|
| Автор: ISerg1986 22.1.2014, 10:48 | ||||
Ну не знаю. Я всё поставил - ничего не работало. Всё удалил, поставил вручную - заработало. Правда теперь не знаю что делать. В примере приводят вот такой код
А это мой код
У меня посылка составляет 64 байта. EP_IN=0x00 -точка входа, но я не уверен т.к. до конца не понимаю что это &ret - непонятно что это Пишет ошибку &ret was not declared in this scope. Смотрю функцию libusb_interrupt_transfer (libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int lenght, int actual_lenght, unsigned int timeout) Понимаю это так Смотрю функцию libusb_interrupt_transfer (экземпляр(обработчик?) устройства, конечная точка чтения,размер читаемого буфера, размер данных, размер данных, период повторения чтения(пауза?) ) |
| Автор: tzirechnoy 22.1.2014, 11:43 | ||||||
Прочитайте описание протокола USB. Да, это очень тяжёлое чтение довольно глупого документа -- но без этого достаточно безсмысленно пытаться самому написать обмен по USB -- хоть в драйвере хоть в устройстве. Кстати, насколько я помню, вроде бы endpoint 0 зарезервировано для control transfers. И почему-то input/output endpoints начинаются с 1 (хотя вроде ничего не мешает и по 0 передать interrupt transfer).
Так ret должна быть твоей переменной. Вообще, это очевидно для сишника: всё, что не описано как константы, переменные или функцыи библиотеки -- это твои переменные.
Нет, Вы в корне неправильно понимаете, а как правильно -- описано в документацыи. Кстати, у Вас опечатка дажэ при копировании прототипа функцыи. |
| Автор: ISerg1986 26.1.2014, 20:16 | ||
| Оставил эту функцию (libusb_interrupt_transfer) пока в покое. Не всё понимаю - трогать пока не буду А в этой libusb_open_device_with_vid_pid(NULL, DEV_VID, DEV_PID); ошибиться уже сложно. Пытаюсь найти (открыть) устройство, зная его VID и PID. ![]() ![]() Мой код
Результат - программа завершилась с кодом 1. То есть return 1 - не видит устройство. VID 0x0483, PID 0x3748 - вроде правильные. В линуксе устройство видно. Других ошибок нет. Вывод компилятора -всё ок Process /usr/bin/make exited normaly. Я правильно указал VID и PID? |
| Автор: kuzulis 26.1.2014, 21:17 |
| А ты сначала проверь что возвращает libusb_init(), затем посмотри исходники утилиты QStLink (о которой ты писал на другом форуме), проверь права доступа и пр. Если ничего не выйдет - значит не судьба, брось это. |
| Автор: ISerg1986 26.1.2014, 23:23 |
Посмотрю, хотя странно всё это. Я уже систему переустановил - Линукс Дебиан последней версии, поставил только необходимые пакеты. QT из репозитория. Всё "чистое", по инструкции -а не работает Можно, но это в крайнем случае. В самом крайнем есть рабочий(? поверю на слово) проект для eclipse, но ведь тут речь про QT? Проверял. Я и так дал пользователю привилегии рута, и через судо запускал. Похоже, что дело не в правах. Так не интересно. Надо довести эксперимент до логического финала. |
| Автор: tzirechnoy 27.1.2014, 12:30 |
| УМВР -- ну, после того, как удалил обе ссылки на mainwindow, который Вы не привели. В смысле -- возвращает 2. Так что проверяйте детали: что запускаете от рута, что собирается именно ваш проект, что он вообще пересобирается (удалите бинарник), что вы код возврата правильно читаете. |
| Автор: ISerg1986 27.1.2014, 13:29 | ||
| Похоже, понял в чём дело. Я не правильно указал VID и PID. Заместо 0х там был другой символ - не русская х, а что-то другое(?). Дело в кодировке. Заработало. Код завершения 0. Но выдаёт странные ошибки в Aplication Output во время работы т.к. непонятно что происходит. А именно - неизвестно, что это за "точка" EP_IN 0x81 и какое у меня должно быть её значение. ![]() Код
|
| Автор: ISerg1986 27.1.2014, 16:45 |
| Переподключил устройство - нашлось ещё несколько usb Пытаюсь подключится к 0xffff 0xbad Выдаёт ошибку permission denied. Нет прав доступа к устройству. Причём к 002 033. Добавил правила ATTRS{idVendor}=="ffff", ATTRS{idProduct}=="0bad", MODE="0666" и ещё одно ATTRS{idVendor}=="002", ATTRS{idProduct}=="0bad", MODE="0666" Сделал reload rules - ошибка не исчезла. ![]() |
| Автор: bsa 28.1.2014, 10:19 |
| ISerg1986, как у тебя с английским? Что в переводе на русский значит слово "bad"? |
| Автор: ISerg1986 29.1.2014, 13:27 |
С отличием школа+институт+спецподготовка 4 года+технический английский Тут bad оно 0xbad т.е обозначение в шестнадцатеричной системе PID устройства. Его так задал мне программист платы. Шина 002 устройство 033 VID 0xffff PID 0xbad. Никакого криминала Сейчас "грешу" на виртуалку. Похоже что система блокирует порты. Устройство подключено к Windows 7 а там VMWare c Linux. Буду покупать отдельный компьютер подешовке т.к. нужно исключить все глюки и ошибки. А так - что ни система, то новые ошибки. А код то один и тот-же. |
| Автор: bsa 31.1.2014, 11:29 | ||
|
| Автор: tzirechnoy 1.2.2014, 16:19 | ||
Ну ещё бы. В man udevadm (--reload-rules) -- дажэ описано, почему она не могла от такого исчезнуть. |
| Автор: ISerg1986 3.2.2014, 10:04 | ||
Вы уверены в этом? Просто моя плата "общается" с HIDterminal'ом в Windows. для этого нужно было установить драйверы. Разобрался. Приложение запускается от root. Говорят, что это не есть хорошо. |