![]() |
|
|
![]()
|
|
| ISerg1986 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 12.1.2014 Репутация: нет Всего: нет |
Решил начать новую тему. Буду задавать свои вопросы тут, по мере их появления. Надеюсь, что тема будет многим полезна т.к. в сети крайне мало информации по работе с 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 нет. Может я не оттуда качал? |
||||
|
|||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
ISerg1986, Для начала укажи ОС. К сожалению, кроссплатформенность не распространяется на библиотеки - только на исходники.
Всё правильно. Ты скачал исходники. Теперь их нужно скомпилировать в библиотеку (linux way). Если у тебя linux, то перейди в каталог, в который ты распаковал архив и набери
Если Windows - то в подкаталоге msvc есть проекты для 6-й, 2005-й и 2010-й студии. Открывай их и компилируй. А чем официальная документация не устраивает ? Зачем на русском ? Учи английский. Без этого в программировании делать просто нечего. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| ISerg1986 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 12.1.2014 Репутация: нет Всего: нет |
Очень мало примеров для новичков. Хотелось бы увидеть пошаговую статью. А английский я знаю, причём довольно не плохо. И технический тоже. 4 года спецкурсов.
Сделал. Получил библиотеку. Подключил. Но посыпались ошибки ( ![]() Это сообщение отредактировал(а) ISerg1986 - 14.1.2014, 12:34 |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Кажется ясно.
Дело в том, что линковщик MinGW (а именно его запускает QtCreator) не понимает формата библиотек MSVC. Тебе нужно собрать libusb при помощи MinGW. Как именно сейчас не подскажу (я не знаю, и сейчас нет времени). Погугли "MinGW libusb" или "MinGW howto link library from linux configure make" или наподобие -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| kuzulis |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: нет Всего: 1 |
Эмм..
Вообще то в Windows есть стандартный драйвер WinUSB который позволяет работать с USB девайсами (гугл в помощь). Но с ограничением: невозможно иметь доступ к изохронным конечным точкам (по крайней мере вроде бы в Windows 8.1 это можно - там добавили эту фичу). И не нужно ничего компилить и libusb вообще не нужен (т.е. не удивлюсь если libusb работает через winusb, но я не уверен, нужно глянуть сорцы)... В Linux же достаточно установить пакет libusb из репозиториев.. и также не нужно ничего компилировать. Еще 5 копеек: работать с USB через libusb - это не очень хорошая идея, потому что большие накладные расходы и пр. фейлы. Это годится только для чего нить простого.. Для серьезных вещей лучше всего сделать собственный драйвер и работать через него. Это сообщение отредактировал(а) kuzulis - 14.1.2014, 15:55 |
|||
|
||||
| ISerg1986 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 12.1.2014 Репутация: нет Всего: нет |
Конечно, не хорошо "скакать" с одной ОС на другую, но всё же...
Ради эксперимента перенёс проект на 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. Это сообщение отредактировал(а) ISerg1986 - 14.1.2014, 16:13 |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Абсолютно не уверен т.к. 1) Линукса вообще не знаю 2) Насколько, всё же, я знаю, в разных линуксах оно может лежать в разных местах и в проекте нужно писать не полный путь, а через переменную окружения (что-то типа $$LIBS или $$LIBPATH) 3) Опять же - предположение - у тебя установлен не SDK для libusb, а сама dll-ка (ну... so-шка в линуксе). Тебе же нужен пакет для разработчиков (SDK). Что-то типа libusb-dev -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| ISerg1986 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 12.1.2014 Репутация: нет Всего: нет |
Жаль. Буду пробовать методом научного тыка. Команда sudo apt-get install libusb-dev говорит, что "Уже установлена самая новая версия libusb-dev". |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
Для Linux ключ -L указывать не надо, если библиотека поставляется разработчиком дистрибутива (твой случай), находится в стандартном месте или указан полный путь к ней. Ключу же -l нужно передавать только часть названия библиотеки - без приставки lib и всех расширений. В твоем случае должно выглядеть так: LIBS += -lusb
Добавлено через 2 минуты и 40 секунд
|
|||
|
||||
| Amp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: 7 Всего: 17 |
||||
|
||||
| ISerg1986 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 12.1.2014 Репутация: нет Всего: нет |
Исправил. Ошибка http://s017.radikal.ru/i435/1401/a9/cd42bb054bc8.jpg Дело в том, что линковщик GCC не понимает формата библиотек? Следует сменить линковщик? http://i023.radikal.ru/1401/0a/afc11a3bd458.jpg
Ок. Я это делал для удобства. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
ISerg1986, на приведенном тобой скриншоте всего лишь есть ошибка отсутствия функции libusb_init, а не неверного формата библиотеки. Неверный формат бывает тогда, когда ты пытаешься прилинковать 32-х битную библиотеку к 64-х битной программе.
|
|||
|
||||
| ISerg1986 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 12.1.2014 Репутация: нет Всего: нет |
||||
|
||||
| tzirechnoy |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 1 Всего: 16 |
1) Зачем Вам библиотеки в /usr/local? libusb ужэ много лет лежыт во всех дистрибутивах линукса.
Если Вы не девелопер библиотеки libusb или хотя бы не экспериментируете с экспериментальными возможностями библиотеки -- то берите дистрибутивный вариант. 2) Указания на самые базовые примеры идут с оригинальной документацыей. libusb developers guide, раздел IV называется "Examples". |
|||
|
||||
| ISerg1986 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 12.1.2014 Репутация: нет Всего: нет |
Мне так посоветовали прописать путь. Сейчас изменил на LIBS += -lusb
Там совсем немного. http://libusb.sourceforge.net/doc/examples-code.html Я пытаюсь сделать следующее. http://clck.ru/92UeH Считать данные с устройства, зная vid и pid. Но на первой-же команде "libusb_init(NULL);", возникает ошибка. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
Ты используешь версию библиотеки 1.0. Она несовместима с 0.1, которая у тебя установлена в системе. Тебе необходимо установить пакет libusb-1.0.0-dev. А библиотеку задавать так: LIBS += -lusb-1.0
|
|||
|
||||
| tzirechnoy |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 1 Всего: 16 |
Как раз на следующей страницэ указано, где взять пример, который можэт просканировать все устройства и прочитать их дескрипторы (включая 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 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 12.1.2014 Репутация: нет Всего: нет |
Спасибо, bsa за ваш ответ. Правда я это уже сделал раньше. Кроме того, до установки libusb-1.0.0-dev, мне пришлось поудалять всё, установленное из репозиториев. А я считал, что лучше всё ставить оттуда. Теперь команда libusb_init(NULL); не выдаёт ошибки. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
|
|||
|
||||
| ISerg1986 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 12.1.2014 Репутация: нет Всего: нет |
Ну не знаю. Я всё поставил - ничего не работало. Всё удалил, поставил вручную - заработало. Правда теперь не знаю что делать. В примере приводят вот такой код
А это мой код
У меня посылка составляет 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 |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 1 Всего: 16 |
Прочитайте описание протокола USB. Да, это очень тяжёлое чтение довольно глупого документа -- но без этого достаточно безсмысленно пытаться самому написать обмен по USB -- хоть в драйвере хоть в устройстве. Кстати, насколько я помню, вроде бы endpoint 0 зарезервировано для control transfers. И почему-то input/output endpoints начинаются с 1 (хотя вроде ничего не мешает и по 0 передать interrupt transfer).
Так ret должна быть твоей переменной. Вообще, это очевидно для сишника: всё, что не описано как константы, переменные или функцыи библиотеки -- это твои переменные.
Нет, Вы в корне неправильно понимаете, а как правильно -- описано в документацыи. Кстати, у Вас опечатка дажэ при копировании прототипа функцыи. |
||||||
|
|||||||
| ISerg1986 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 12.1.2014 Репутация: нет Всего: нет |
Оставил эту функцию (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? Это сообщение отредактировал(а) ISerg1986 - 26.1.2014, 20:19 |
|||
|
||||
| kuzulis |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: нет Всего: 1 |
А ты сначала проверь что возвращает libusb_init(), затем посмотри исходники утилиты QStLink (о которой ты писал на другом форуме), проверь права доступа и пр. Если ничего не выйдет - значит не судьба, брось это.
|
|||
|
||||
| ISerg1986 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 12.1.2014 Репутация: нет Всего: нет |
Посмотрю, хотя странно всё это. Я уже систему переустановил - Линукс Дебиан последней версии, поставил только необходимые пакеты. QT из репозитория. Всё "чистое", по инструкции -а не работает Можно, но это в крайнем случае. В самом крайнем есть рабочий(? поверю на слово) проект для eclipse, но ведь тут речь про QT? Проверял. Я и так дал пользователю привилегии рута, и через судо запускал. Похоже, что дело не в правах. Так не интересно. Надо довести эксперимент до логического финала. |
|||
|
||||
| tzirechnoy |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 1 Всего: 16 |
УМВР -- ну, после того, как удалил обе ссылки на mainwindow, который Вы не привели. В смысле -- возвращает 2.
Так что проверяйте детали: что запускаете от рута, что собирается именно ваш проект, что он вообще пересобирается (удалите бинарник), что вы код возврата правильно читаете. |
|||
|
||||
| ISerg1986 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 12.1.2014 Репутация: нет Всего: нет |
Похоже, понял в чём дело. Я не правильно указал VID и PID. Заместо 0х там был другой символ - не русская х, а что-то другое(?). Дело в кодировке.
Заработало. Код завершения 0. Но выдаёт странные ошибки в Aplication Output во время работы т.к. непонятно что происходит. А именно - неизвестно, что это за "точка" EP_IN 0x81 и какое у меня должно быть её значение. ![]() Код
|
|||
|
||||
| ISerg1986 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 12.1.2014 Репутация: нет Всего: нет |
Переподключил устройство - нашлось ещё несколько 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 - ошибка не исчезла. ![]() Это сообщение отредактировал(а) ISerg1986 - 27.1.2014, 16:51 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
ISerg1986, как у тебя с английским? Что в переводе на русский значит слово "bad"?
|
|||
|
||||
| ISerg1986 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 12.1.2014 Репутация: нет Всего: нет |
С отличием школа+институт+спецподготовка 4 года+технический английский Тут bad оно 0xbad т.е обозначение в шестнадцатеричной системе PID устройства. Его так задал мне программист платы. Шина 002 устройство 033 VID 0xffff PID 0xbad. Никакого криминала Сейчас "грешу" на виртуалку. Похоже что система блокирует порты. Устройство подключено к Windows 7 а там VMWare c Linux. Буду покупать отдельный компьютер подешовке т.к. нужно исключить все глюки и ошибки. А так - что ни система, то новые ошибки. А код то один и тот-же. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
||||
|
||||
| tzirechnoy |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 1 Всего: 16 |
Ну ещё бы. В man udevadm (--reload-rules) -- дажэ описано, почему она не могла от такого исчезнуть. |
|||
|
||||
| ISerg1986 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 12.1.2014 Репутация: нет Всего: нет |
Вы уверены в этом? Просто моя плата "общается" с HIDterminal'ом в Windows. для этого нужно было установить драйверы. Разобрался. Приложение запускается от root. Говорят, что это не есть хорошо. Это сообщение отредактировал(а) ISerg1986 - 7.2.2014, 11:55 |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |