使用 libusb-win32 与 USB 到 DMX512 接口通信,找不到任何端点

Using libusb-win32 to communicate with USB to DMX512 interface, can't find any endpoints

本文关键字:通信 找不到 任何 端点 接口 DMX512 libusb-win32 USB 使用      更新时间:2023-10-16

我正在尝试使用 libusb-win32 通过 USB 到 DMX512 接口将原始数据从我的计算机发送到一组灯。到目前为止,一切似乎都运行良好,除了由于某种原因,程序无法识别适配器上的任何端点。这是我的代码片段:

// 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>
}

可以看出,没有识别的端点,最重要的是只有一个设备、一个配置、一个接口和一个 altset,这就是我陷入死胡同的原因。

所以我正在尝试找出用于写入 USB 的端点地址,或者我拥有的适配器是否可能与此库不兼容。

提前致谢

这仅仅意味着您仅限于通过端点 0x00 上的控制传输进行通信。每个设备都必须具有终结点 0,并接受通过此终结点的控件传输(因为这是主控制器将与之通信以枚举或配置设备的终结点)。控制传输可以在一个端点上读取和写入。

您没有任何关于如何控制此设备或任何嗅探USB传输的说明吗?通过随机测试找出所有数据以使用控制转移将需要很长时间。;)

作为后续工作,我确实设法让灯工作。Dryman 是正确的,因为我必须在端点 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 的空字符数组。