Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.223.171.12] |
|
Сообщ.
#1
,
|
|
|
Буэнос диас, амигос!
Настал момент, надо поработать с USB-устройствами. Нашел либу libusb и решил сделать сабж. Вывод решил оформить как в линуксовой команде lsusb, типа: но моя сборка под Линукс выдает вот так: Ладно, думаю, соберу под Винду, посмотрю как там (Линух был на виртуалке, Винда на железе): Собственно, вопросы, которые возникли: 1) Что с моей прогой не так под Линухом, штатная же команда lsusb выводит описалова 2) Что с моей прогой не так под Виндой, почему столько устройств не опознано, и откуда в описалове вопросы (локаль не та или что?) Вот код: #include <iostream> #include <iomanip> #include <cstring> #include "libusb.h" using namespace std; void print_device(libusb_device *dev) { struct libusb_device_descriptor desc; libusb_device_handle *handle = NULL; unsigned char str[256] = {0}; if (libusb_get_device_descriptor(dev, &desc) < 0) { cout << "failed to get device descriptor" << endl; return; } cout << "Bus " << std::setfill('0') << std::setw(3) << hex << +libusb_get_bus_number(dev) << " " << "Device " << std::setfill('0') << std::setw(3) << hex << +libusb_get_device_address(dev) << ": " << "ID " << std::setfill('0') << std::setw(4) << hex << desc.idVendor << ":" << std::setfill('0') << std::setw(4) << hex << desc.idProduct; if (libusb_open(dev, &handle) == LIBUSB_SUCCESS) { if (desc.iProduct) { if (libusb_get_string_descriptor_ascii(handle, desc.iProduct, str, sizeof(str)) > 0) { string s(reinterpret_cast<char*>(str)); cout << " " << s.substr(s.find_first_not_of(" \t")); } } } else cout << " -"; cout << endl; if (handle) libusb_close(handle); } int main() { libusb_device **devs; ssize_t cnt; if (libusb_init(NULL) < 0) return 1; cnt = libusb_get_device_list(NULL, &devs); if (cnt < 0) return 1; for (int i = 0; devs[i]; i++) print_device(devs[i]); libusb_free_device_list(devs, 1); libusb_exit(NULL); return 0; } UPD Запуск проги под Линуксом, но с правами рута несколько изменил картину: |
Сообщ.
#2
,
|
|
|
0) libusb - кривая сома по себе.
Инициализация у вас не правильно. libusb_init(NULL); libusb_set_debug(NULL, 255); // необходимо добавить Честно не помню уже для чего но исходный код libusb открыт можете посмотреть. 1) По первому вопросу у вас основная ошибка в том что вы не подключились к драйверу libusb_get_string_descriptor_ascii выполняет посылки на устройства, а без подсоединения к драйверу это не будет работать.И да если вы забудете отсоединится, то повторно тоже работать не будет. Так что нужен вот такой вот код: fHadnle = libusb_open_device_with_vid_pid(NULL, MyDevice_VID, MyDevice_PID); fFailed=false; int ck=-1; if (fHadnle==NULL) { fFailed=true; } else { const int INTERFACE = 0; if (libusb_kernel_driver_active(fHadnle, INTERFACE)) libusb_detach_kernel_driver(fHadnle, INTERFACE); ck = libusb_claim_interface(fHadnle, INTERFACE); } if (ck<0) { qDebug(lError) << "Ошибка захвата USB интерфейса=" << libusb_error_name(ck); fFailed=true; } а вот после него можете вызывать свой libusb_get_string_descriptor_ascii 2) По второму вопросу. Это от консоли не зависит и вообще насколько помню это принципиально не решается. Но вы можете попробовать разные драйверы(провайдеры) их в том году было 3 штуки: - libusbK-3.0.7.0-bin-chk - два других не помню. |
Сообщ.
#3
,
|
|
|
Цитата Pavia @ Честно не помню уже для чего Я помню Это чтобы либа могла сбрасывать в stderr протокол в нужном уровне дебаг-сообщений. Поэтому это не неправильно. Я нашел для себя чуток полезного кода из исходников либы: enum libusb_error { LIBUSB_SUCCESS = 0, LIBUSB_ERROR_IO = -1, LIBUSB_ERROR_INVALID_PARAM = -2, LIBUSB_ERROR_ACCESS = -3, LIBUSB_ERROR_NO_DEVICE = -4, LIBUSB_ERROR_NOT_FOUND = -5, LIBUSB_ERROR_BUSY = -6, LIBUSB_ERROR_TIMEOUT = -7, LIBUSB_ERROR_OVERFLOW = -8, LIBUSB_ERROR_PIPE = -9, LIBUSB_ERROR_INTERRUPTED = -10, LIBUSB_ERROR_NO_MEM = -11, LIBUSB_ERROR_NOT_SUPPORTED = -12, /* NB: Remember to update LIBUSB_ERROR_COUNT below as well as the message strings in strerror.c when adding new error codes here. */ LIBUSB_ERROR_OTHER = -99, }; Добавлено Цитата Pavia @ libusb_kernel_driver_active(fHadnle, INTERFACE) Это *nix only. Но я и без подключения к нему вытягиваю описания. См UPD, только рутовые права нужны оказались. |