Я пытаюсь запустить простой код, написанный с помощью libusb-win32 на VS2010, чтобы получить информацию о подключенных USB-устройствах. Я не могу заставить его работать успешно.
#include <stdio.h>
#include <string.h>
#include "lusb0_usb.h"
int verbose = 1;
int print_device(struct usb_device *dev, int level);
int main(int argc, char *argv[])
{
struct usb_bus *bus;
if (argc > 1 && !strcmp(argv[1], "-v"))
verbose = 1;
usb_init();
usb_set_debug(255);
int nBusses = usb_find_busses();
int nDevices = usb_find_devices();
if(nDevices <=0) return 0;
for (bus = usb_get_busses(); bus; bus = bus->next)
{
if (bus->root_dev && !verbose)
print_device(bus->root_dev, 0);
else
{
struct usb_device *dev;
for (dev = bus->devices; dev; dev = dev->next)
print_device(dev, 0);
}
}
return 0;
}
Конфигурация проекта Win32, отладка, и я использую x86 DLL & lib файлы Я могу скомпилировать код.
usb_find_busses()
возвращает 1 & usb_find_devices()
возвращает 0. Я не понимаю, почему я не получаю правильные числа. Печать bus-> root_dev выводит следующий вывод.
Dev #0: 0000 - 0000
bLength: 18
bDescriptorType: 01h
bcdUSB: 0200h
bDeviceClass: 09h
bDeviceSubClass: 00h
bDeviceProtocol: 00h
bMaxPacketSize0: 40h
idVendor: 0000h
idProduct: 0000h
bcdDevice: 0100h
iManufacturer: 0
iProduct: 0
iSerialNumber: 0
bNumConfigurations: 0
Couldn't retrieve descriptors
Я запустил inf-wizard.exe и там я могу видеть все устройства с идентификатором производителя и устройства. Я не понимаю, чего мне не хватает.
usb_find_devices()
документация в API libusb 0.1 говорит:
Возвращает количество изменений с момента предыдущего вызова этой функции (общее количество удаленных новых устройств и устройств).
Таким образом, он не возвращает количество доступных устройств, как вы ожидаете. Если вам нужно это значение, перечислите список шин, считая сами устройства.
В противном случае просто проигнорируйте счет и перейдите к циклу печати шины, он будет работать на любых подключенных устройствах.
Это, как говорится, есть более новый API libusb 1.0, но его документация не упоминает usb_find_devices()
совсем. usb_find_devices()
кажется, был заменен новым usb_get_devices_list()
функция:
Возвращает список USB-устройств, подключенных в данный момент к системе.
Это ваша точка входа в поиск USB-устройства для работы.
Вы действительно должны использовать более новый 1.0 API, в соответствии с веб-сайт libusb:
Существует несколько реализаций API libusb-0.1:
- libusb-0.1 — самая первая реализация libusb.
- libusb-compat-0.1 — это библиотека совместимости, которая предоставляет API libusb-0.1 с помощью API libusb-1.0.
- libusb-win32 только для Windows реализация API libusb-0.1. Проект libusb-win32 также создал драйвер ядра Windows с открытым исходным кодом libusb0.sys, который предоставляет API-интерфейс пользовательского пространства, позволяющий получать доступ к USB-устройствам вне ядра Windows.
…
Поскольку API-интерфейсы 0.1 и 1.0 используют разные префиксы, они совместимы друг с другом. Обычно обе системы устанавливаются параллельно в системе. Мы настоятельно рекомендуем использовать libusb-1.0 вместе с libusb-compat-0.1 вместо древнего кода libusb-0.1, так что программы, которые используют как API 0.1, так и 1.0 API в разных частях программы или в разных библиотеках, используемых программой, все будут использовать libusb-1.0 для фактического доступа к устройству. Это важно, чтобы избежать потенциальных конфликтов между использованием libusb-1.0 и libusb-0.1 в том же процессе.
… libusb-1.0 рекомендуется для всех новых разработок. Разработчикам рекомендуется портировать существующие приложения, использующие libusb-0.1, для использования нового API.
…
libusb-0.1 (устаревший API)
…
- Обратите внимание, что libusb-win32 это отдельный проект, который все еще видит активное развитие. Драйвер ядра следующего поколения libusb-win32 (libusbk.sys) основан на KMDF. libusbk библиотека будет поддерживать существующий API libusb-win32, libusb-1.0 API и WinUSB-подобный API. Пользователям libusb-win32, которые знакомы с API libusb-win32, рекомендуется продолжать использовать его, поскольку он будет поддерживаться проектом libusb-win32. Пользователи libusb-win32, которые заинтересованы в libusb-1.0, также будут поддерживаться после интеграции бэкэнда libusbk. Может потребоваться дальнейшее усовершенствование API libusb-1.0 (скажем, libusb-1.1), чтобы оно больше подходило для пользователей Windows.
Других решений пока нет …