kukudeYSB 2025-03-12 19:10 采纳率: 0%
浏览 10

libusb使用libusb_bulk_transfer进行上传,返回值为0,actual_length的值也是0

libusb测试USB设备传输过程中。使用libusb_bulk_transfer进行传输时,返回值是0,但是actual_length的值也是0。是不是就是证明没有传输成功。该如何解决以上问题。环境为,windows环境下,测速设备为U盘,使用的驱动为libusb-win32(v1.4.0.0)

        unsigned char *buff = new unsigned char[m_nCurrentBlockSize];
        LARGE_INTEGER startTime, endTime;
        int actual_length = 0;
        QueryPerformanceCounter(&startTime);
        
        int nResult = libusb_bulk_transfer(m_pTestHandle, m_OutEndpoint, buff, m_nCurrentBlockSize, &actual_length, 5000);
     
        QueryPerformanceCounter(&endTime);    
  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-03-12 19:10
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题解答

    libusb_bulk_transfer返回值为0,actual_length的值也是0,可能是因为传输过程中出现了错误。以下是一些可能的解决方案:

    1. 检查传输的设备和接口:确保使用的设备和接口正确,使用libusb_get_device_listlibusb_get_device_descriptor函数来获取设备信息。
    2. 检查传输的缓冲区:确保传输的缓冲区正确,使用libusb_bulk_transfer函数时,传输的缓冲区不能为NULL。
    3. 检查传输的超时设置:确保传输的超时设置正确,使用libusb_set_timeout函数来设置超时时间。
    4. 检查设备的配置:确保设备的配置正确,使用libusb_get_config_descriptor函数来获取设备的配置信息。
    5. 检查传输的数据:确保传输的数据正确,使用libusb_bulk_transfer函数时,传输的数据不能为NULL。

    以下是一个简单的示例代码,演示如何使用libusb_bulk_transfer进行传输:

    #include <libusb.h>
    
    int main() {
        libusb_context *ctx;
        libusb_device *dev;
        libusb_device_descriptor desc;
        libusb_config_descriptor *cfg;
        libusb_interface *intf;
        libusb_transfer *transfer;
    
        // 初始化libusb
        libusb_init(&ctx);
    
        // 找到设备
        dev = libusb_get_device(ctx, 0);
        if (!dev) {
            printf("Failed to find device\n");
            return -1;
        }
    
        // 获取设备描述符
        libusb_get_device_descriptor(dev, &desc);
    
        // 获取设备配置
        cfg = libusb_get_config_descriptor(dev);
        if (!cfg) {
            printf("Failed to get config descriptor\n");
            return -1;
        }
    
        // 获取设备接口
        intf = libusb_get_interface(ctx, dev, 0);
        if (!intf) {
            printf("Failed to get interface\n");
            return -1;
        }
    
        // 创建传输
        transfer = libusb_alloc_transfer(0);
        if (!transfer) {
            printf("Failed to allocate transfer\n");
            return -1;
        }
    
        // 设置传输参数
        libusb_transfer_set_device(transfer, dev);
        libusb_transfer_set_interface(transfer, intf);
        libusb_transfer_set_timeout(transfer, 1000); // 1秒超时
        libusb_transfer_set_buffer(transfer, (uint8_t*)buf, sizeof(buf));
    
        // 发送传输
        libusb_submit_transfer(transfer);
    
        // 等待传输完成
        libusb_wait_for_transfer(transfer);
    
        // 获取传输结果
        int ret = libusb_transfer_get_status(transfer);
        int actual_length = libusb_transfer_get_actual_length(transfer);
    
        // 处理传输结果
        if (ret == LIBUSB_TRANSFER_COMPLETED) {
            printf("Transfer completed successfully\n");
        } else {
            printf("Transfer failed\n");
        }
    
        // 释放资源
        libusb_free_transfer(transfer);
        libusb_free_config_descriptor(cfg);
        libusb_free_device_descriptor(&desc);
        libusb_exit(ctx);
    
        return 0;
    }
    

    在上面的示例代码中,我们使用libusb_bulk_transfer函数来发送传输,并使用libusb_transfer_get_statuslibusb_transfer_get_actual_length函数来获取传输结果。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月12日