Russian Qt Forum

Qt => Вопросы новичков => Тема начата: useruser от Январь 15, 2014, 11:59



Название: Работа с библиотекой libusb
Отправлено: useruser от Январь 15, 2014, 11:59
Продолжаю работать с библиотекой libusb. ОС Linux Debian. Команда sudo apt-get install libusb-dev выполнена, т.е. "Уже установлена самая новая версия libusb-dev".
Код pro файла
Код:
#-------------------------------------------------
#
# Project created by QtCreator 2014-01-14T00:03:19
#
#-------------------------------------------------

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = usb_test
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h
FORMS    += mainwindow.ui
LIBS += -lusb


Код main.cpp файла
Код:
#include "mainwindow.h"
#include <QApplication>
#include "lusb.h"
//#include "lib/hidapi.h"
#include <stdio.h>
#include <string.h>
//#include "lib/hidapi.h"

int main(int argc, char *argv[])
{
libusb_init(NULL);

    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}



На первой-же команде "libusb_init(NULL);", возникает ошибка - undefined reference to libusb_init

В чём может быть ошибка?








Название: Re: Работа с библиотекой libusb
Отправлено: alex312 от Январь 15, 2014, 12:31
Цитировать
В чём может быть ошибка?
Вывод компилятора в студию !

Или попробуй перед сборкой выполнить qmake.


Название: Re: Работа с библиотекой libusb
Отправлено: useruser от Январь 15, 2014, 12:39
Вывод компилятора
(http://s020.radikal.ru/i722/1401/80/3895b29990cb.jpg)


Название: Re: Работа с библиотекой libusb
Отправлено: alex312 от Январь 15, 2014, 13:04
Код:
#include "lusb.h"
???
помоему надо
#include <usb.h>


Название: Re: Работа с библиотекой libusb
Отправлено: useruser от Январь 15, 2014, 14:53
Цитировать
помоему надо
#include <usb.h>
Нет такого файла в папке libusb-1.0.9. Там много файлов, но такого нет.
lusb.h - это переименованный libusb.h (48 Кб)


Название: Re: Работа с библиотекой libusb
Отправлено: alex312 от Январь 15, 2014, 15:06
libusb-1.0.9.
тогда в проекте библиотеку надо подключать не -lusb а -lusb-1.0


Название: Re: Работа с библиотекой libusb
Отправлено: useruser от Январь 15, 2014, 15:16
тогда в проекте библиотеку надо подключать не -lusb а -lusb-1.0
Не понимаю почему, но сделал, как вы написали.
Ошибка "can not find -lusb-1.0"


Название: Re: Работа с библиотекой libusb
Отправлено: alex312 от Январь 15, 2014, 16:10
Напиши-ка какая версия Debian у тебя, и какие пакеты *usb установлены.


Название: Re: Работа с библиотекой libusb
Отправлено: alex312 от Январь 15, 2014, 17:45
Может поможет.
Как это выглятит у меня (Ubuntu 12.04)

(https://dl.dropboxusercontent.com/u/88492657/screensoot/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%20%D0%BE%D1%82%202014-01-15%2016_09_50.png)

(https://dl.dropboxusercontent.com/u/88492657/screensoot/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%20%D0%BE%D1%82%202014-01-15%2016_29_17.png)

во вложении проект.


Название: Re: Работа с библиотекой libusb
Отправлено: useruser от Январь 15, 2014, 17:50
Напиши-ка какая версия Debian у тебя, и какие пакеты *usb установлены.
У меня тоже есть подозрения, по этому поводу. Но я новичок и мало что понимаю.
Может версия библиотеки, установленная в системе не совпадает с версией в хедер файле libusb.h? Хотя это моё предположение.
Debian 7.1 (wheezy)
lib_usb-dev тоже установлен
(http://s003.radikal.ru/i204/1401/bb/c9303093f2d0.jpg)

Может поможет.
Как это выглядит у меня (Ubuntu 12.04)
во вложении проект.
Спасибо. Посмотрю. Надеюсь хоть что-то пойму.


Название: Re: Работа с библиотекой libusb
Отправлено: useruser от Январь 15, 2014, 20:16
Посмотрел ваш проект, попытался запустить.
Ошибка. Похоже, не может найти libusb.
Путь
INCLUDEPATH и LIBS менял (на картинке). Всё равно не находит. Возможно, ошибка в пути, а по этому пути лежат только "документы"...
(http://s017.radikal.ru/i411/1401/88/d75ff7f2f46a.jpg)
(http://s017.radikal.ru/i403/1401/bb/5489d437791b.jpg)


Название: Re: Работа с библиотекой libusb
Отправлено: alex312 от Январь 15, 2014, 20:41
http://packages.debian.org/ru/sid/libusb-1.0-0-dev

И зачем ты подключаешь папку с документацией ?


Название: Re: Работа с библиотекой libusb
Отправлено: useruser от Январь 15, 2014, 21:19
И зачем ты подключаешь папку с документацией ?
Это я уже понял.)
Удалил все пакеты, всё переустановил "вручную" (не из репозиториев). Вроде, начало работать.


Название: Re: Работа с библиотекой libusb
Отправлено: Alex Custov от Январь 15, 2014, 21:34
В .pro файле:

Код:
CONFIG += link_pkgconfig
PKGCONFIG += libusb-1.0


Название: Re: Работа с библиотекой libusb
Отправлено: useruser_ от Январь 22, 2014, 11:37
Не могли бы вы подсказать немного по коду. А конкретно по функции libusb_interrupt_transfer. Вижу, что тут собрались люди "в теме"  :)
В примере эта функция использована для чтения данных (хотя interrupt переводится как прерывание).

Мой код
Код:
unsigned char buf[64];

int returned = libusb_interrupt_transfer(handle, EP_IN, 64, 64, &ret, 1000);
       if (returned >= 0) {
int My_buf=(int)buf[0];
}

У меня посылка составляет 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 (экземпляр(обработчик?) устройства, конечная точка чтения,размер читаемого буфера, размер данных, размер данных,  период повторения чтения(пауза?)  )


Итого
1) Пока не понятно, какая у меня должна быть EP_IN -точка входа и где и чем её смотреть? У меня есть плата, посылающая массив 64 бита.
2) &ret - непонятно что это (int actual_lenght?, автоповторение предыдущего значения?) и почему возникает ошибка.


Название: Re: Работа с библиотекой libusb
Отправлено: kuzulis от Январь 22, 2014, 12:10
Цитировать
В примере эта функция использована для чтения данных (хотя interrupt переводится как прерывание).

1. Почитай для начала USB спецификацию и разберись что такое bulk, isochronous и interrupt конечные точки, зачем они нужны, чем отличаются, какой максимальный размер пакета можно прокачать через точку того или иного типа и пр.

2. Посмотри конфигурацию своего девайса, какие он имеет типы точек и пр. Например через lsusb -a в Linux.
3. Выбери точки на которые будешь слать/читать данные (точки могут быть как двунаправленные и иметь одинаковые номера, так и определенного направления - зависит от железки).
4. Напиши код.


Название: Re: Работа с библиотекой libusb
Отправлено: useruser_ от Январь 22, 2014, 12:28
Не могли бы вы дать мне ссылку на usb спецификацию?
В сети много информации, есть на русском, английском, usb 2.0 и т.д. Какую лучше прочитать?


Название: Re: Работа с библиотекой libusb
Отправлено: alex312 от Январь 22, 2014, 12:32
Какую лучше прочитать?
Для начала - http://usb.fober.net/teoriya/Tipy-peredachi-dannyx/


Название: Re: Работа с библиотекой libusb
Отправлено: alex312 от Январь 22, 2014, 12:36
Смотрю функцию libusb_interrupt_transfer (libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int lenght, int actual_lenght,  unsigned int timeout)
Не смотри больше туда, смотри сюда (http://libusb.sourceforge.net/api-1.0/group__syncio.html#gac412bda21b7ecf57e4c76877d78e6486).
И осознай разницу между int actual_lenght и int * transferred .

P.S. о том что переменную перед использованием надо объявить, надеюсь уже догадался.


Название: Re: Работа с библиотекой libusb
Отправлено: useruser_ от Январь 23, 2014, 12:07
alex312 -спасибо за статьи, почитал.
Насчёт переменных это и так ясно.

lsusb полезная команда, но в моём линуксе её не было. И apt тоже. Установил нужные пакеты, перезагрузился и "сломал" линукс. Не загружается. Разбираться долго.
Ну оно может и к лучшему. Переустановил всё с нуля -QT, пакеты. Теперь libusb установленная из репозитория работает и линукс "посвежее" (debian-7.3.0-i386-kde).

Пытаюсь сделать следующий шаг. Найти (открыть) устройство, зная его VID и PID.

(http://s020.radikal.ru/i722/1401/ea/4871187e48b1.jpg)
(http://i047.radikal.ru/1401/1f/5ecfe4c6547b.jpg)


Мой код
Код:
#include <QApplication>
#include "mainwindow.h"
#include "libusb.h"

#define DEV_VID 0x0483
#define DEV_PID 0x3748
#define DEV_CONFIG 1
#define DEV_INTF 0
#define EP_IN 0x81
#define USB_DEBUG_LEVEL 0


int main(int argc, char *argv[])
{


libusb_init(NULL);
libusb_set_debug(NULL, USB_DEBUG_LEVEL);  // уровень вывода отладочных сообщений
libusb_device_handle *handle = libusb_open_device_with_vid_pid(NULL, DEV_VID, DEV_PID);

if (handle == NULL) {
return 1;
}
else
return 2;



QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}




Результат - программа завершилась с кодом 1. То есть return 1 - не видит устройство.
VID 0x0483, PID 0x3748 - вроде правильные. В линуксе устройство видно. Других ошибок нет. Вывод компилятора -всё ок Process /usr/bin/make exited normaly.
Я правильно указал VID и PID?


Название: Re: Работа с библиотекой libusb
Отправлено: alex312 от Январь 23, 2014, 12:58
Результат - программа завершилась с кодом 1. То есть return 1 - не видит устройство.
1. Включи отладку libusb.
2. вот тебе контрольные программы - https://github.com/mobyfab/qstlink2 , https://github.com/texane/stlink


Название: Re: Работа с библиотекой libusb
Отправлено: useruser_ от Январь 24, 2014, 17:01
Цитировать
1. Включи отладку libusb.
Сделал
#define USB_DEBUG_LEVEL 1

Цитировать
2. вот тебе контрольные программы
Установил (не без помощи сообщества debian)
(http://s019.radikal.ru/i639/1401/e8/cb11a9d808c0.jpg)
Теперь можно понять, что не так с VID и PID?


Название: Re: Работа с библиотекой libusb
Отправлено: alex312 от Январь 24, 2014, 17:11
Теперь можно понять, что не так с VID и PID?
Конечно, ведь у QStlink2 есть исходники.

ЗЫ А еще могут быть проблемы с правами доступа. Попробуй запустить свою программу с правами root .


Название: Re: Работа с библиотекой libusb
Отправлено: useruser_ от Январь 24, 2014, 20:25
Цитировать
Конечно, ведь у QStlink2 есть исходники.
Вижу, что написан на Qt. И это программатор. У меня как бы уже есть программатор под windows. На нём и программировал плату.
В QStlink2 исходниках много cpp файлов. Предлагаете искать во всех функцию, отвечающую за VID PID?

Цитировать
Попробуй запустить свою программу с правами root
Выполнил sudo ./usb как советовали ниже. Без результата.


Название: Re: Работа с библиотекой libusb
Отправлено: lit-uriy от Январь 24, 2014, 21:02
>>sudo usb
будет искать в путях указанных в переменной окружения PATH
в линухе в отличие от виндовоза, в текущем каталоге не ищется.

поэтому казывай путь полностью, можно относительный путь использовать:
sudo ./usb
(относительно текущего каталога)


Название: Re: Работа с библиотекой libusb
Отправлено: useruser_ от Март 11, 2014, 18:08
Прошло много времени. Кое в чём разобрался.
Сейчас пытаюсь передать сигнал на плату. Передаю единицу.

Код:
unsigned char buffer[1];
static int transferred;
ret = libusb_bulk_transfer(handle,EP_IN,buffer,1, &transferred,1000);
Программа выполняется без ошибок, если так можно сказать.
Но ничего не происходит, и ret возвращает -7. В норме должно 0.
Точку указываю ту-же что и для чтения.

Нашел предполагаемую точку для записи. Изменил. Запустил программу. Ничего не происходит.
В аутпуте libusbx error [submit_bulk_transfer] submiturb failed error -1 errorno= -2
-1