восьмеричная постоянная ошибка (libusb)

Я использую Ubuntu 12.04 для компиляции файла c ++, который имеет следующий код

#include <iostream>
#include <libusb-1.0/libusb.h>

using namespace std;

int main(){
//pointer to pointer of device used to retrieve a list of devices
libusb_device **devs;
libusb_device_handle *dev_handle; //a device handle
libusb_context *ctx = NULL; //A LIBUSB session
int r;// for return values
ssize_t cnt; //holding number of devices in list
r = libusb_init(&ctx); // initialize the library for the session we just declared

if(r < 0){
cout <<"init error "<<r<< endl;
return 1;
}

libusb_set_debug(ctx, 3); // set verbosity level to 3, as suggested in the documentation
cnt = libusb_get_device_list(ctx, &devs); //get the list of devices

if (cnt < 0) {
cout <<"Get Device Error "<< endl; // there was an error
return 1;
}

cout << cnt <<" Device in list " << endl;
//dev_handle = libusb_open_device_with_vid_pid(ctx, 0951, 1689); // these are vendor id and product id   //simon's usb(duracell)1516:1213
dev_handle = libusb_open_device_with_vid_pid(ctx, 0951, 1689); //these are vendorID and productID I found for my usb device

if (dev_handle == NULL){
cout <<"Cannot open device "<< endl;
}else{
cout << "Device opened" << endl;
}

libusb_free_device_list(devs, 1);// free the list unref the devices in it

unsigned char *data = new unsigned char[4];//data to write
data[0] = 'a'; data[1] = 'b'; data[2] = 'c'; data[3] = 'd';//some dummy values

int actual; //used to find how many bytes were written

if (libusb_kernel_driver_active(dev_handle, 0) == 1){// findout if kernal driver attached
cout << "Kernal Driver Active" << endl;
if (libusb_detach_kernel_driver(dev_handle, 0) == 0 ){  //detach it
cout<< "Kernal Driver Detached" << endl;
}
}

r = libusb_claim_interface(dev_handle, 0);// claim interface 0 (the first) of devices

if(r < 0){
cout <<"Cannot claim interface "<<endl;
return 1;
}

cout <<"Claimed interface "<<endl;

cout<<"data->"<<data<<"<-"<<endl; // just to see the data we want to write : abcd
cout<<"Writing data..."<<endl;

r = libusb_bulk_transfer(dev_handle, (2 | LIBUSB_ENDPOINT_OUT), data, 4, &actual, 0);//my device's out endpoint was 2, found withe trial - the device had two endpoints: 2 and 129

if(r == 0 && actual == 4){  // we wrote 4 bytes successfully
cout<<"Writing successfull"<<endl;
}else{
cout<<"write error"<<endl;
}

r = libusb_release_interface(dev_handle, 0); // release the claimed interface

if(r!=0) {
cout<<"Cannot Release Interface"<<endl;
return 1;
}
cout<<"Released interface"<<endl;
libusb_close(dev_handle); // close the device we opened
libusb_exit(ctx); // need to be called to end the

delete[] data;// delete the allocated memory for data
return 0;
}

но когда я компилирую приведенный выше код, используя следующую командную строку (это идентификатор продукта и идентификатор поставщика моего USB)

dev_handle = libusb_open_device_with_vid_pid(ctx, 0951, 1689);

компилятор выдает следующую ошибку

transfer_data_libusb.cpp:30:55: error: invalid digit "9" in octal constant

Кто-то посоветовал мне удалить ведущий ноль, т. Е. («951» вместо «0951»)
но когда я делаю это, файл успешно компилируется, но когда я запускаю скомпилированную версию, возникает следующая ошибка

7 Device in list
Cannot open device
Segmentation fault (core dumped)

не знаю, что мне делать, вы можете помочь, кстати, я использую следующую команду для компиляции приведенного выше кода

g++ transfer_data_libusb.cpp $(pkg-config --libs libusb-1.0) -o transfer_data_libusb

большое спасибо за ваше время

0

Решение

Ваш номер, вероятно, в шестнадцатеричном. Использование:

0x951

вместо вашего 0951,

А также:

0x1689

вместо вашего 1689,

Если вы видите другие цифры в (я предполагаю, что это ваш продукт):

http://usbspeed.nirsoft.net/?g=32gb

у них есть a в f символы, поэтому это означает, что формат должен быть шестнадцатеричным.

3

Другие решения

Когда ваш звонок не удается

dev_handle = libusb_open_device_with_vid_pid(ctx, 0951, 1689);

dev_handle будет NULL.

if (dev_handle == NULL){
cout <<"Cannot open device "<< endl;
//treat error here and quit

Вы должны прекратить работать на dev_handle затем.

0

По вопросам рекламы [email protected]