第一次成功的libusb_bulk_transfer()写入USB大容量存储设备后,libusb_bulk_transfer()读取挂起

时间:2013-11-01 13:41:17

标签: linux libusb-1.0

我正在尝试在我的USB大容量存储设备上执行写/读libusb_bulk_transfer()。但是在第一次成功的libusb_bulk_transfer()写入之后,我的程序只是挂起并且没有执行libusb_bulk_transfer()读取。我发现我的USB设备已脱离。为什么我无法执行阅读?

以下是我的代码片段:

e = libusb_get_configuration(handle, &config2);
if (e!=0)
{
    printf("\n***Error in libusb_get_configuration\n");
    libusb_free_device_list(devs, 1);
    libusb_close(handle);
    return -1;
}
printf("\nConfigured value : %d", config2);

if (config2 != 1)
{
    libusb_set_configuration(handle, 1);
    if (e!=0)
    {
        printf("Error in libusb_set_configuration\n");
        libusb_free_device_list(devs, 1);
        libusb_close(handle);
        return -1;
    }
    else
        printf("\nDevice is in configured state!");
}

if (libusb_kernel_driver_active(handle, 0) == 1)
{
    printf("\nKernel Driver Active");
    if (libusb_detach_kernel_driver(handle, 0) == 0)
        printf("\nKernel Driver Detached!");
    else
    {
        printf("\nCouldn't detach kernel driver!\n");
        libusb_free_device_list(devs, 1);
        libusb_close(handle);
        return -1;
    }
}

e = libusb_claim_interface(handle, 0);
if (e < 0)
{
    printf("\nCannot Claim Interface");
    libusb_free_device_list(devs, 1);
    libusb_close(handle);
    return -1;
}
else
    printf("\nClaimed Interface\n");

char *Report_to_write, *Report_to_read;
int transferred = 0;
int received = 0;
int nbytes = 8; // As protocol suggested it should be 8 bytes

Report_to_write = (char *)malloc(nbytes);
Report_to_read = (char *)malloc(nbytes);

Report_to_write[0] = 0x01; // cmd
Report_to_write[1] = Report_to_write[2] = Report_to_write[3] = 15; // HOUR
Report_to_write[4] = Report_to_write[5] = Report_to_write[6] = 30; // MIN
Report_to_write[7] = 255; // some checksum

memset(Report_to_read, '\0', 8);

e = libusb_bulk_transfer(handle, BULK_EP_OUT, Report_to_write, 8, &transferred, 0);

if (e == 0 && transferred == 8)
{
    printf("\nWrite successful!");
    printf("\nSent %d bytes with string: %s\n", transferred, Report_to_write);
}
else
    printf("\nError in write! e = %d and transferred = %d\n", e, transferred);

e = libusb_bulk_transfer(handle, BULK_EP_IN, Report_to_read, 8, &received, 0);  //64: Max Packet   Length
if (e == 0)
{
    printf("\nReceived: ");
    printf("%c", Report_to_read[1]); //Will read a string
    //sleep(1);
}
else
{
    printf("\nError in read! e = %d and received = %d\n", e, received);
    return -1;
}

e = libusb_release_interface(handle, 0);
libusb_free_device_list(devs, 1);
libusb_close(handle);
libusb_exit(NULL);

1 个答案:

答案 0 :(得分:1)

命名和字符串看起来非常类似于Stack Overflow问题 Read/write on a pen drive using libusb: libusb_bulk_transfer() 中的代码(由我编写)。

观察您的代码,我只能预测您没有使用正确的终点地址。