Я впервые учусь использовать libusb v1.0.0 в Ubuntu 12.10. Вот небольшой тестовый код, который я использую, чтобы попытаться понять, как использовать этот API:
#include <libusb-1.0/libusb.h>
...
libusb_device **list;
libusb_get_device_list(ctx, &list); // Returns 11 USB devices which is correct.
for (size_t idx = 0; list[idx] != NULL; idx ++)
{
libusb_device *dev = list[idx];
libusb_device_descriptor desc = {0};
int rc = libusb_get_device_descriptor(dev, &desc);
На данный момент rc == 0, что означает, что он должен был завершиться успешно. Источник: документация для *libusb_get_device_descriptor()*.
Но структура desc
всегда пуста. Ни одно из полей никогда не устанавливается. Если я изменю последние две строки выше на это:
libusb_device_descriptor desc = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int rc = libusb_get_device_descriptor(dev, &desc);
... затем, когда libusb_get_device_descriptor()
возвращается, я вижу, что desc
остается неизменным, подтверждая для меня, что я не получаю того, что ожидаю от этого API.
Я также пытался запустить a.out
от имени пользователя root на тот случай, если для этого требуются повышенные привилегии. Поиск в Google по libusb_get_device_descriptor
ни к чему не привел.
Соответствующие команды, которые я запускал, чтобы попробовать этот код:
sudo apt-get install libusb-1.0.0-dev
g++ -ggdb test.cpp -lusb-1.0
./a.out
Ах! Сумасшедшая ошибка пользователя! код шарта помог мне разобраться. Вот код, который я на самом деле использовал — посмотрите, сможете ли вы найти ошибку:
std::cout << "rc == " << libusb_get_device_descriptor(dev, &desc) << std::endl
<< "vendor == " << desc.idVendor << std::endl;
Я предполагаю, что компилятор оценивает это так, что он может свободно оценивать desc.idVendor
до того, как вызов libusb_get_device_descriptor()
будет фактически сделан. Виноват.