0

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

ご覧のとおり、認識されたエンドポイントはありません。その上、1 つのデバイス、1 つの構成、1 つのインターフェイス、および 1 つの代替設定しかないため、私は行き止まりになっています。

そのため、USB への書き込みに使用するエンドポイント アドレスを把握しようとしています。または、使用しているアダプターがこのライブラリと互換性がない可能性があるかどうかを調べています。

前もって感謝します

4

2 に答える 2

1

これは単に、エンドポイント 0x00 でのコントロール転送を介した通信に制限されていることを意味します。すべてのデバイスにはエンドポイント 0 が必要であり、このエンドポイントを介して制御転送を受け入れる必要があります (これは、デバイスを列挙または構成するためにホスト コントローラーが通信するエンドポイントであるためです)。コントロール転送は、1 つのエンドポイントで読み書きできます。

このデバイスの制御方法や盗聴された USB 転送についての説明はありませんか? コントロール転送を使用するすべてのデータをランダムなテストで把握するには、長い時間がかかります。;)

于 2016-06-10T07:51:51.457 に答える
0

フォローアップとして、なんとかライトを機能させることができました。エンドポイント 0x00 経由で制御転送を使用しなければならなかったという点で、Dryman は正しかった。質問のサンプルコードで行ったように、実際にはインターフェースを主張する必要さえありませんでした。実際には、次のコード行を使用することになりました。

usb_control_msg(h, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT, cmd_SetSingleChannel, value, channel, buffer, sizeof(buffer), 5000);

hデバイス ハンドルはどこですか。 はcmd_SetSingleChannel値 1valueの整数です。 は設定しているチャネルの値を表す整数です。 は設定しているchannelチャネルを表す整数でありbuffer、サイズ 8 の空の char 配列です。

于 2016-06-16T19:02:01.140 に答える