小奥呀 2024-10-11 18:51 采纳率: 0%
浏览 63

libusb通信 libusb_bulk_transfer

C++ libusb通信问题,请教!
errcode = libusb_bulk_transfer(usb_handle, INT_RECV_EP, ReceiveBuf, sizeof(ReceiveBuf), &rlen, 0);
使用libusb_bulk_transfer读数据,设备上电后第一次读取,errcode返回0,成功,再次进行读取数据操作时errcode就返回**-7**,超时,重新给设备上电就又可以正常读取一次,请大家帮忙看看那这是哪里的问题。
大概流程如下:

int ret = libusb_init(NULL); 
ret = get_device_descriptor(&udev_desc, &udev);
ret = get_device_endpoint(&udev_desc, &udev);
usb_handle = libusb_open_device_with_vid_pid(NULL, udev.vid, udev.pid); 
ret = libusb_claim_interface(usb_handle, udev.bInterfaceNumber);
ret = libusb_claim_interface(usb_handle, 1);
unsigned char SendData[20]={0};
int errcode = libusb_bulk_transfer(usb_handle, INT_SEND_EP, SendData, sizeof(SendData), &wlen, 0);//发送
Sleep(200);
unsigned char ReceiveBuf[20] = {0};
errcode = libusb_bulk_transfer(usb_handle, INT_RECV_EP, ReceiveBuf, sizeof(ReceiveBuf), &rlen, 0);//接收
libusb_close(usb_handle);
libusb_exit(NULL);
usb_handle = NULL;

在线 感谢 各位!

  • 写回答

1条回答 默认 最新

  • 香格里辣 2024-10-11 18:52
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从您提供的代码和描述来看,问题可能出现在以下几个方面:

    1. 设备连接状态:设备在第一次读取时可能处于正确的状态,但在后续读取时可能进入了某种未知状态。尝试在每次读取前重新确认设备的连接状态和状态。这可以通过再次调用某些初始化函数来实现,比如重新打开设备并再次获取设备描述符和端点信息。
    2. 设备响应超时:libusb_bulk_transfer函数返回-7表示超时错误。可能是因为设备在处理上一次的数据传输时花费的时间过长,或者在接收到命令后需要一定的时间进行准备和响应,这个时间超过了libusb_bulk_transfer设置的超时时间。您可以尝试增加超时时间,或者调整设备的配置参数,以优化数据传输的速度和响应时间。
    3. 设备接口配置:在代码中看到两次调用libusb_claim_interface函数,且接口编号不同。请确认这是否正确,是否确实需要两次接口声明。有时候设备只有一个接口,只需要声明一次即可。此外,确保接口编号是正确的。
    4. 数据发送和接收顺序:在发送数据后立即接收数据可能不是最佳实践。在某些情况下,设备可能需要一些时间来处理发送的数据或准备接收的数据。您可以尝试在发送数据后添加一些延时,或者在接收数据前确认设备已经准备好接收数据。

    针对上述问题,您可以尝试以下解决方案:

    • 在每次读取前重新初始化设备连接状态,包括重新打开设备、获取设备描述符和端点信息。
    • 增加libusb_bulk_transfer函数的超时时间,以确保设备有足够的时间响应命令。
    • 确认接口声明是否正确,并检查接口编号是否正确。
    • 在发送数据后添加延时,或者在接收数据前确认设备已经准备好接收数据。

    如果问题仍然存在,可能需要更深入地了解设备的具体规格和通信协议,以便更好地调试和解决通信问题。此外,还可以参考libusb的文档和示例代码以获取更多信息和指导。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月11日