2011-01-27 3 views
3

Я пишу программу пространства пользователя, предназначенную для управления некоторым устройством через usb, поэтому я решил использовать libusb (libusb-1.0) для отправки управляющих сообщений и получения ответов с этого устройства.libusb basic example wanted

Но я постоянно получаем следующую кучу ошибок из моего кода (даже тогда, когда он выполняется с помощью «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; 
} 

Что случилось с кодом ? И как это можно исправить?

ОС: Ubuntu 10,10

+0

Вы могли получить его для чтения и записи с вашего устройства? Были ли существенные изменения в вашем коде, который вы могли бы опубликовать? – RunHolt

ответ

3

ли вам не нужно открывать() устройство, прежде чем установить его конфигурацию и утверждают, что это?

9

Отвечая на этот вопрос, как я столкнулся с этой проблемой на те же ОСА и был в состоянии решить следующий образом:

скачать и скомпилировать последний libusb исходного кода 1.0.8.

Ниже приведены некоторые API вызовы, которые я использовал для того, чтобы требовать интерфейс USB 0:

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, вы можете выполнить следующие команды (Ex. мои данные устройства)

$ lsusb
...
Шины 001 Устройства 013: ID 0930: 6544 Корпорации Toshiba Kingston DataTraveler 2.0 Стики (2 Гб)
...

Выделенные двоеточия строка содержит поставщик и идентификатор продукта, соответственно, ,

Как скомпилировать код:

Я использовал следующую команду, чтобы скомпилировать мой код:

/бен/Баш Libtool --silent --tag = CC = --mode ссылку г ++ -Wall -Wundef -Wunused -Wshadow -D_DEBUG -I ../ libusb -g -O2 -o чтения read.cpp ../libusb/libusb-1.0.la -lusb-1,0 -lrt

Copy libtool в область компиляции из извлеченного каталога libusb-1.0.8.

Надеюсь, это поможет.