Я пытаюсь отправить необработанные данные на мой свет с компьютера через интерфейс USB-DMX512 с помощью libusb-win32. Пока что все работает хорошо, за исключением того, что по какой-то причине программа не распознает конечные точки на адаптере.
Вот фрагмент моего кода:
// initialize
usb_init();
usb_find_busses();
usb_find_devices();
usb_bus busses = *usb_get_busses();
// open the device
struct usb_device *dev = busses.devices;
usb_dev_handle *h = usb_open(dev);
usb_claim_interface(h, 0);
...
// close the device
usb_release_interface(h, 0);
usb_close(h);
Когда я просматриваю структуры в отладчике, это данные внутри них:
dev {
next //<NULL>
prev //<NULL>
filename //0x008a9938
bus //0x008a9710
descriptor //{bLength = 18 ... }
config {
bLength //9
bDescriptorType //2
wTotalLength //18
bNumInterfaces //1
bConfigurationValue //1
iConfiguration //0
bmAttributes //128
MaxPower //250
interface {
altsetting {
bLength //9
bDescriptorType //4
bInterfaceNumber //0
bAlternateSetting //0
bNumEndpoints //0
bInterfaceClass //0
bInterfaceSubClass //0
bInterfaceProtocol //0
iInterface //0
endpoint //<NULL>
extra //<NULL>
extralen //0
}
num_altsetting //1
}
extra //<NULL>
extralen //0
}
dev //<NULL>
devnum //1
num_children //0
children //<NULL>
}
Как можно видеть, конечные точки не распознаются, и, кроме того, есть только одно устройство, одна конфигурация, один интерфейс и одна альтернативная настройка, поэтому я зашел в тупик.
Поэтому я пытаюсь выяснить, какой адрес конечной точки использовать для записи на USB-накопитель, или, возможно, имеющийся у меня адаптер просто не совместим с этой библиотекой.
заранее спасибо
Это просто означает, что вы ограничены связью через передачу управления в конечной точке 0x00. Каждое устройство должно иметь конечную точку 0 и принимать передачу управления через эту конечную точку (поскольку именно с этой конечной точкой контроллер хоста будет взаимодействовать для перечисления или настройки устройства). Передачи управления могут читать и писать на одной конечной точке.
У вас нет описания того, как управлять этим устройством или каким-либо перехваченным USB-портом? Выяснение всех данных для использования управления передачей путем случайного тестирования займет долго время. 😉
В качестве продолжения мне удалось включить свет. Драйман был прав в том, что мне пришлось использовать передачу управления через конечную точку 0x00. На самом деле мне даже не нужно было запрашивать интерфейс, как я делал в своем примере кода для вопроса. На самом деле все сводилось к использованию следующей строки кода:
usb_control_msg(h, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT, cmd_SetSingleChannel, value, channel, buffer, sizeof(buffer), 5000);
куда h
это ручка моего устройства, cmd_SetSingleChannel
является целым числом со значением 1, value
является целым числом, представляющим значение канала, который вы устанавливаете, channel
целое число, представляющее, какой канал вы устанавливаете, и buffer
пустой массив символов размера 8