Hello everyone

I am running Ubuntu 12.04 compiling a c++ file which has the following code

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

but when i compile the above code using the following command line (these are the product id and vendor id of my usb)

dev_handle = libusb_open_device_with_vid_pid(ctx, 0951, 1689);

the compiler throws the following error

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

Someone had adviced me to remove the leading zero ie ("951" instead of "0951")
but when i do that, the file gets compiled successfully, but when i rnu the compiled version this throws the following error

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

dont know what should I do can you please help btw i use the following command to compile the above code

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

thank you very much for you time

Recommended Answers

All 2 Replies

Starting a number with 0 means that it is an octal number which means that all digits are at least 0 and at most 7. An octal number looks like a decimal number but it has a different meaning. You must be wary of accidentally using an octal number when you want an ordinary decimal number. You are lucky that one of your digits was greater than 7 or else your program would have used the wrong number without any warning from the compiler.

When dev_handle is NULL, you should stop using it because it doesn't point to anything meaningful. That may be the cause of your segmentation fault.

If you build with debug symbols included ( -g ) and then run your program under the GNU debugger (gdb) or some other debugger, when it segFaults it'll tell you which line and allow you to check the values of variables to see which one is causing the segFault.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.