4

USB経由でデバイスを制御することを目的としたユーザー空間プログラムを作成しているため、libusb(libusb-1.0)を使用して制御メッセージを送信し、そのデバイスから応答を受信することにしました。

しかし、コードから次のような一連のエラーを常に受け​​取ります (「sudo」を使用して実行した場合でも):

USB error: could not set config 0: Device or resource busy
set configuration: failed
Check that you have permissions to write to 007/012 and, if you don't, that you set up hotplug (http://linux-hotplug.sourceforge.net/) correctly.
USB error: could not claim interface 0: Device or resource busy
claim interface: failed
USB error: error submitting URB: No such file or directory
bulk writing: failed
USB error: error submitting URB: No such file or directory
bulk reading: failed
response was: 

コードは次のとおりです。

usb_dev_handle* find_device ();

int 
main (int argc, char *argv[])
{
    usb_dev_handle* udev;
    int status;
    char request[] = "K1"; // 'ping' command used to check communication
    char response[256];

    udev = find_device ();
    // udev is successfully found here

    status = usb_set_configuration (udev, 0);
    printf ("set configuration: %s\n", status ? "failed" : "passed");

    status = usb_claim_interface (udev, 0);
    printf ("claim interface: %s\n", status ? "failed" : "passed");

    status = usb_bulk_write (udev, 3, request, sizeof (request), 500);
    printf ("bulk writing: %s\n", status ? "failed" : "passed");

    status = usb_bulk_read (udev, 2, response, sizeof (response), 500);
    printf ("bulk reading: %s\n", status ? "failed" : "passed");

    printf ("response was: %s\n", response);

    usb_close (udev);

    return 0;
}

コードの何が問題になっていますか? そして、それはどのように修正できますか?

OS: Ubuntu 10.10

4

3 に答える 3

10

同じOSでこの問題に直面し、次の方法で解決できたので、この質問に答えます。

最新の libusb ソース コード 1.0.8 をダウンロードしてコンパイルします。

以下は、USB インターフェイス 0 を要求するために使用したいくつかの API 呼び出しです。

libusb_init(NULL);
libusb_open_device_with_vid_pid(NULL, vendor_id, product_id);
libusb_detach_kernel_driver(devh, 0);
libusb_claim_interface(devh, 0);
libusb_close(devh);
libusb_exit(NULL);

上記の例の変数の説明:

static struct libusb_device_handle *devh = NULL;
uint16_t vendor_id;
uint16_t product_id;

ベンダー ID と製品 ID を取得するには、次のコマンドを実行します (例: my device info)。

$ lsusb
...
Bus 001 Device 013: ID 0930:6544 Toshiba Corp. Kingston DataTraveler 2.0 Stick (2GB)
...

太字のコロンで区切られた文字列には、ベンダーと製品 ID がそれぞれ含まれています。

コードのコンパイル方法:

次のコマンドを使用してコードをコンパイルしました。

/bin/bash libtool --silent --tag=CC --mode=link g++ -Wall -Wundef -Wunused -Wshadow -D_DEBUG -I../libusb -g -O2 -o read read.cpp ../libusb/ libusb-1.0.la -lusb-1.0 -lrt

解凍した libusb-1.0.8 ディレクトリから libtool をコンパイル領域にコピーします。

お役に立てれば。

于 2011-11-11T09:01:17.970 に答える
3

構成を設定して要求する前に、デバイスを open() する必要はありませんか?

于 2011-01-28T13:31:19.290 に答える