本帖最后由 lvben5d 于 2022-7-26 10:52 编辑
1. 最近一个项目 用的高GD32E103 USBD 设备模式,上位机我也在用QT开发, CSDN已经是全部收费了,有的人还乱传没实用的代码。下位机这边 VID 我建议大家用GD32自带的先别改, PID可以随意!
2. 网上绝大部分 libusb win32开发得代码都是不实战的,我现在想了一个事件等待方式,接收和发送 分别通过不同回调函数返回值来区分。
按照网上99%可以收到的方式,都很不合理, 我们希望线程 可以等待接收事件,其他线程也可以强制发送,发送完毕后,也会事件完成。
接收 应该用这:
usb_recv_transfer = libusb_alloc_transfer(0); //new一个接收传输 也要new一个发送传输吧 libusb_fill_bulk_transfer(usb_recv_transfer, usb_dev_handle, USB_IN_EP1, recv_buf, sizeof(recv_buf), recv_process_cb, ptransfer_user_data, 0xFFFFFFFF); /* 提交参数配置传输请求 下次这个接收端点不需要再次输入 直接submit等下一次接收*/
result_status = libusb_submit_transfer(usb_recv_transfer); //申请接收 每次收到包后,都要重新申请!!!类似GD32下位机 EP_OUT 一样处理
while (!(*ptransfer_completed))
{
struct timeval tv = {0x7FFFFFFF, 0}; //tv非0 要一直阻塞等待事件吗?
result_status = libusb_handle_events_timeout_completed(ctx, &tv, ptransfer_completed); //等待插入 或。
}
备注: 1. libusb_fill_bulk_transfer函数 usb接收的话,只需要执行一次(不需要多次fill USB底层会把每次数据丢入recv_buf), 发送则每次都要fill 再submit!! 2. 我的QT 5.13版本, WIN10专业版64,libusb 此刻不支持插拔检测,所以用了windows的 nativeEvent 来处理插拔事件(USB设备热拔的时候, usb_recv_transfer=接收 会触发进 LIBUSB_TRANSFER_STALL even中断,要注意!)
|