Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [QT4] Работа с библиотекой libusb, Работа с библиотекой libusb 
:(
    Опции темы
bsa
Дата 14.1.2014, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Ты используешь версию библиотеки 1.0. Она несовместима с 0.1, которая у тебя установлена в системе. Тебе необходимо установить пакет libusb-1.0.0-dev. А библиотеку задавать так: LIBS += -lusb-1.0
PM   Вверх
tzirechnoy
Дата 14.1.2014, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Цитата
Считать данные с устройства, зная vid и pid.


Как раз на следующей страницэ указано, где взять пример, который можэт просканировать все устройства и прочитать их дескрипторы (включая vid/pic/class/etc )

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


Как несложно заметить, в примере -- 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

PM MAIL   Вверх
ISerg1986
Дата 20.1.2014, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 12.1.2014

Репутация: нет
Всего: нет



Цитата(bsa @  14.1.2014,  23:17 Найти цитируемый пост)
Ты используешь версию библиотеки 1.0. Она несовместима с 0.1

Спасибо, bsa за ваш ответ. Правда я это уже сделал раньше. Кроме того, до установки  libusb-1.0.0-dev, мне пришлось поудалять всё, установленное из репозиториев. 
А я считал, что лучше всё ставить оттуда.
Теперь команда libusb_init(NULL); не выдаёт ошибки.
PM MAIL   Вверх
bsa
Дата 20.1.2014, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(ISerg1986 @  20.1.2014,  20:17 Найти цитируемый пост)
Кроме того, до установки  libusb-1.0.0-dev, мне пришлось поудалять всё, установленное из репозиториев. 
А я считал, что лучше всё ставить оттуда.
все лучше ставить из репозиториев. Если же у тебя система не поддерживает данную библиотеку, то тогда можно ставить и из исходников. Но, например, в Ubuntu libusb-1.0.0-dev имеется штатная.

PM   Вверх
ISerg1986
Дата 22.1.2014, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 12.1.2014

Репутация: нет
Всего: нет



Цитата(bsa @  20.1.2014,  19:56 Найти цитируемый пост)
все лучше ставить из репозиториев.

Ну не знаю. Я всё поставил - ничего не работало. Всё удалил, поставил вручную - заработало.

Правда теперь не знаю что делать. smile 


В примере приводят вот такой код
Код

int returned = libusb_interrupt_transfer(handle, EP_IN, buf, DATA_SIZE, &ret, 1000);


А это мой код
Код

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 (экземпляр(обработчик?) устройства, конечная точка чтения,размер читаемого буфера, размер данных, размер данных,  период повторения чтения(пауза?)  )
PM MAIL   Вверх
tzirechnoy
Дата 22.1.2014, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Цитата
EP_IN=0x00 -точка входа, но я не уверен т.к. до конца не понимаю что это


Прочитайте описание протокола USB. Да, это очень тяжёлое чтение довольно глупого документа -- но без этого достаточно безсмысленно пытаться самому написать обмен по USB -- хоть в драйвере хоть в устройстве.
Кстати, насколько я помню, вроде бы endpoint 0 зарезервировано для control transfers. И почему-то input/output endpoints начинаются с 1 (хотя вроде ничего не мешает и по 0 передать interrupt transfer).

Цитата
Пишет ошибку &ret was not declared in this scope.


Так ret должна быть твоей переменной. Вообще, это очевидно для сишника: всё, что не описано как константы, переменные или функцыи библиотеки -- это твои переменные.

Цитата
Понимаю это так


Нет, Вы в корне неправильно понимаете, а как правильно -- описано в документацыи. Кстати, у Вас опечатка дажэ при копировании прототипа функцыи. 
PM MAIL   Вверх
ISerg1986
Дата 26.1.2014, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 12.1.2014

Репутация: нет
Всего: нет



Оставил эту функцию (libusb_interrupt_transfer) пока в покое. Не всё понимаю - трогать пока не буду  smile 

А в этой libusb_open_device_with_vid_pid(NULL, DEV_VID, DEV_PID); ошибиться уже сложно.

Пытаюсь найти (открыть) устройство, зная его VID и PID.
user posted image
user posted image

Мой код
Код

#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?


Это сообщение отредактировал(а) ISerg1986 - 26.1.2014, 20:19
PM MAIL   Вверх
kuzulis
Дата 26.1.2014, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



А ты сначала проверь что возвращает libusb_init(), затем посмотри исходники утилиты QStLink (о которой ты писал на другом форуме), проверь права доступа и пр. Если ничего не выйдет - значит не судьба, брось это. smile
PM MAIL   Вверх
ISerg1986
Дата 26.1.2014, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 12.1.2014

Репутация: нет
Всего: нет



Цитата(kuzulis @  26.1.2014,  21:17 Найти цитируемый пост)
А ты сначала проверь что возвращает libusb_init()

Посмотрю, хотя странно всё это. Я уже систему переустановил - Линукс Дебиан последней версии, поставил только необходимые пакеты.
QT из репозитория. Всё "чистое", по инструкции -а не работает  smile 

Цитата(kuzulis @  26.1.2014,  21:17 Найти цитируемый пост)
затем посмотри исходники утилиты QStLink

Можно, но это в крайнем случае. В самом крайнем есть рабочий(? поверю на слово) проект для eclipse, но ведь тут речь про QT?

Цитата(kuzulis @  26.1.2014,  21:17 Найти цитируемый пост)
 проверь права доступа и пр

Проверял. Я и так дал пользователю привилегии рута, и через судо запускал. Похоже, что дело не в правах.

Цитата(kuzulis @  26.1.2014,  21:17 Найти цитируемый пост)
 Если ничего не выйдет - значит не судьба, брось это

Так не интересно. Надо довести эксперимент до логического финала.
PM MAIL   Вверх
tzirechnoy
Дата 27.1.2014, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



УМВР -- ну, после того, как удалил обе ссылки на mainwindow, который Вы не привели. В смысле -- возвращает 2.

Так что проверяйте детали: что запускаете от рута, что собирается именно ваш проект, что он вообще пересобирается (удалите бинарник), что вы код возврата правильно читаете.
PM MAIL   Вверх
ISerg1986
Дата 27.1.2014, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 12.1.2014

Репутация: нет
Всего: нет



Похоже, понял в чём дело. Я не правильно указал VID и PID. Заместо 0х там был другой символ - не русская х, а что-то другое(?). Дело в кодировке.
Заработало. Код завершения 0. Но выдаёт странные ошибки в Aplication Output во время работы т.к. непонятно что происходит.
А именно - неизвестно, что это за "точка" EP_IN 0x81 и какое у меня должно быть её значение.

user posted image

Код
Код

#include <QApplication>
#include "mainwindow.h"
#include "libusb.h"

#define DEV_VID 0x483//0x5824
#define DEV_PID 0x3748 //0x1503
#define DEV_CONFIG 1
#define DEV_INTF 0//0
#define EP_IN 0x81 //хз какое это у меня значение
#define USB_DEBUG_LEVEL 1
//#define EP_OUT 0x01
#define DATA_SIZE 64


void interrupt_transfer_loop(libusb_device_handle *handle);



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 2;
}
//else
//return 1;

if (libusb_kernel_driver_active(handle,DEV_INTF))
      libusb_detach_kernel_driver(handle, DEV_INTF);



if (libusb_claim_interface(handle,  DEV_INTF) < 0){
//       printf("Ошибка интерфейса\n");
    return 2;
   }


interrupt_transfer_loop(handle);

libusb_attach_kernel_driver(handle, DEV_INTF);
libusb_close(handle);
libusb_exit(NULL);






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





void interrupt_transfer_loop(libusb_device_handle *handle) {
    unsigned char buf[DATA_SIZE];
    int ret;

    while (1) {

        int returned = libusb_interrupt_transfer(handle, EP_IN, buf, DATA_SIZE, &ret, 1000);

        if (returned >= 0) {
            buf[0] = (int)buf[0];
            buf[1] = (int)buf[1];
        }
    }
}

void bulk_transfer_loop(libusb_device_handle *handle) {
//  libusb_bulk_transfer() хз что тут писать

}



PM MAIL   Вверх
ISerg1986
Дата 27.1.2014, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 12.1.2014

Репутация: нет
Всего: нет



Переподключил устройство - нашлось ещё несколько usb  smile 
Пытаюсь подключится к 0xffff 0xbad
Выдаёт ошибку permission denied. Нет прав доступа к устройству. Причём к 002 033.

Добавил правила
ATTRS{idVendor}=="ffff", ATTRS{idProduct}=="0bad", MODE="0666"
и ещё одно
ATTRS{idVendor}=="002", ATTRS{idProduct}=="0bad", MODE="0666"

Сделал reload rules - ошибка не исчезла.
user posted image


Это сообщение отредактировал(а) ISerg1986 - 27.1.2014, 16:51
PM MAIL   Вверх
bsa
Дата 28.1.2014, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



ISerg1986, как у тебя с английским? Что в переводе на русский значит слово "bad"?  smile 
PM   Вверх
ISerg1986
Дата 29.1.2014, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 12.1.2014

Репутация: нет
Всего: нет



Цитата(bsa @  28.1.2014,  10:19 Найти цитируемый пост)
ISerg1986, как у тебя с английским? 

С отличием школа+институт+спецподготовка 4 года+технический английский smile 

Тут bad оно 0xbad т.е обозначение в шестнадцатеричной системе PID устройства. Его так задал мне программист платы.
Шина 002 устройство 033 VID 0xffff PID 0xbad. Никакого криминала  smile 

Сейчас "грешу" на виртуалку. Похоже что система блокирует порты. Устройство подключено к Windows 7 а там VMWare c Linux.
Буду покупать отдельный компьютер подешовке т.к. нужно исключить все глюки и ошибки. А так - что ни система, то новые ошибки. А код то один и тот-же.
PM MAIL   Вверх
bsa
Дата 31.1.2014, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(ISerg1986 @  29.1.2014,  14:27 Найти цитируемый пост)
Его так задал мне программист платы.
Шина 002 устройство 033 VID 0xffff PID 0xbad. Никакого криминала
Шутник ваш программист. Обычно, такие значения имеют невалидные идентификаторы.

PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0994 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.