【问题标题】:Using libusb-win32 to communicate with USB to DMX512 interface, can't find any endpoints使用libusb-win32与USB转DMX512接口通信,找不到任何端点
【发布时间】:2016-06-09 19:04:09
【问题描述】:

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

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

可以看出,没有识别出端点,除此之外,只有一个设备、一个配置、一个接口和一个 altsetting,这就是我处于死胡同的原因。

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

提前致谢

【问题讨论】:

    标签: c++ c windows libusb dmx512


    【解决方案1】:

    这仅仅意味着您只能通过端点 0x00 上的控制传输进行通信。每个设备都必须有一个端点 0 并通过该端点接受控制传输(因为这是主机控制器将与之交谈以枚举或配置设备的端点)。控制传输可以在一个端点上读写。

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

    【讨论】:

    • 我一直希望this DMX 通信协议适用于我的接口,唯一的问题是我不确定这个协议的通用性。
    • 这描述了串行通信的协议。您的设备没有可用的串行驱动程序吗?使用 com 端口比使用串口转 USB 设备完成所有 USB 操作要容易得多。
    • 我不太清楚你的意思,是否有软件可以让我与 USB 进行交互,就好像它是一个 COM 端口一样?因为我只有一个看起来像this的设备
    • 至少你提到的协议是这样工作的。是的,有这样的软件,大多数制造商都提供。但这不是通用的,您需要设备制造商提供的设备(如果有)。您可以尝试使用 libusb 获得结果,但我怀疑任何人都可以在短时间内猜出所需的信息。问题是信息的巨大(并非夸大)缺乏。您有两个选择:查找制造商的驱动程序和相应的手册或实施您自己的驱动程序,这可能需要很长时间,除非您有文档(只有制造商可以提供)。
    • 如果我倾向于尝试自己通过 libusb 发送原始数据,您会建议我如何做?我应该使用usb_control_msg()吗,如果是,会是什么类型的请求?
    【解决方案2】:

    作为跟进,我确实设法让灯正常工作。 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 的空字符数组。

    【讨论】:

    • 由于诸如声明接口和配置设备之类的事情也可以通过端点 0x00 上的控制传输进行,因此您无需执行任何操作即可使用它,但总线可能是配置和声明后速度会快一点,但我认为这与您必须发送的数据大小无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多