打印

libusb1.0.26 的win 32 x64上位机驱动 编程 正解~

[复制链接]
1309|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lvben5d|  楼主 | 2022-7-8 12:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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中断,要注意!)







使用特权

评论回复
沙发
lvben5d|  楼主 | 2022-7-8 15:12 | 只看该作者
int iret = libusb_bulk_transfer( usb_dev_handle, USB_OUT_EP1, sendbuf, len, &actual_length,  5000);    用这种阻塞方式去发送,是不太合理的。 虽然可以超时

使用特权

评论回复
板凳
vsfopen| | 2022-7-10 04:55 | 只看该作者
libusb支持热插拔的,只是在windows下,没做这个功能而已。
如果检测的话,可以用RegisterDeviceNotification
参考:https://github.com/vsfteam/vsf/blob/master/source/component/usb/driver/hcd/winusb_hcd/vsf_winusb_hcd.c

使用特权

评论回复
地板
lvben5d|  楼主 | 2022-7-18 08:02 | 只看该作者
本帖最后由 lvben5d 于 2022-7-21 07:25 编辑

楼上说的没错,libusb  1.0.26版本,WN11 我试了下 libusb自带的 热插拔检测函数,虽然libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) 返回是具备的,但libusb_hotplug_register_callback(注册后 返回-3 非0因此用不了) 。  后面百度 用了WINDOWS检测热插拔  用的是hDevNotify = RegisterDeviceNotification((HANDLE)this->winId(), &NotifacationFiler, DEVICE_NOTIFY_WINDOW_HANDLE);     
处理函数 在重写 bool Lucky::nativeEvent(const QByteArray &eventType, void *message, long *result) 里处理插 或 拔掉事件

使用特权

评论回复
5
lvben5d|  楼主 | 2022-7-18 08:07 | 只看该作者
本帖最后由 lvben5d 于 2022-7-21 07:27 编辑
vsfopen 发表于 2022-7-10 04:55
libusb支持热插拔的,只是在windows下,没做这个功能而已。
如果检测的话,可以用RegisterDeviceNotificati ...

现在比较麻烦的是,使用我这个RegisterDeviceNotification后,  即使USB没有收发数据,热拔的时候,libusb_handle_events_timeout_completed 因为监听了recv和send ,  会进入 LIBUSB_TRANSFER_STALL  event中断, 此时必须关闭事件监听。 libusb_handle_events_timeout_completed 函数 貌似无法选择接收和发送 分开在两个不同线程,去单独监听?(我是发送和接收 都用这一个函数来 监听) 因此需要在 libusb_fill_bulk_transfer 里注册不同的 recv 和send回调函数 来区分 到底是usb 接收中断 还是发送中断  以及usb 其他event .

使用特权

评论回复
6
xdqfc| | 2022-7-24 09:23 | 只看该作者
lvben5d 发表于 2022-7-18 08:07
现在比较麻烦的是,使用我这个RegisterDeviceNotification后,  即使USB没有收发数据,热拔的时候,libusb ...

GD32咱也在用,但是实事求是的讲,涉及到通信这块的,无论是USB,BLE还是CAN或者网络等等,CH32要好太多太多,不仅仅是例程给力,而且他们的技术服务也无可挑剔,非常非常迅速,还有就样品这块,基本上只要你申请或者一个电话,最多付给快递费,很快人家就发过来。CH32的招牌可能就是通信,所以人家的例程非常非常好,不像其他厂家弄的含糊其辞,靠个人去揣摩。

使用特权

评论回复
7
lvben5d|  楼主 | 2022-7-24 09:34 | 只看该作者
xdqfc 发表于 2022-7-24 09:23
GD32咱也在用,但是实事求是的讲,涉及到通信这块的,无论是USB,BLE还是CAN或者网络等等,CH32要好太多 ...

推荐个型号 我看看,  类似GD32E103  需要3个LIN口 1个USB FS  带一个CAN 最好~  主频我48M就够用

使用特权

评论回复
8
xdqfc| | 2022-7-24 09:34 | 只看该作者
lvben5d 发表于 2022-7-18 08:07
现在比较麻烦的是,使用我这个RegisterDeviceNotification后,  即使USB没有收发数据,热拔的时候,libusb ...

兄弟可尝试用用CH573或者571这个料,通信这块除了基本通信外设,还包含USB,BLE,内核是国产IP,指令集是RISC_V,成品调试的时候,假如仿真器或者电脑不方便连接的话,我都是用蓝牙BLE,直接编写一个手机APP,通过BLE跟CH573连接起来,所有需要关注的数据通过BLE上传给手机,或者手机下发调试数据,非常方便,关键是芯片价格才2块出头,32位的RISC_V指令集。

使用特权

评论回复
9
xdqfc| | 2022-7-24 09:39 | 只看该作者
lvben5d 发表于 2022-7-24 09:34
推荐个型号 我看看,  类似GD32E103  需要3个LIN口 1个USB FS  带一个CAN 最好~  主频我48M就够用 ...

你可以直接发邮件给他们,或者直接跟他们电话沟通,网站上都有,我之前也是这样跟他们沟通的。沁恒官网。

使用特权

评论回复
10
lvben5d|  楼主 | 2022-7-24 09:42 | 只看该作者
xdqfc 发表于 2022-7-24 09:34
兄弟可尝试用用CH573或者571这个料,通信这块除了基本通信外设,还包含USB,BLE,内核是国产IP,指令集是 ...

初看了下,的确不错   这个带蓝牙 就牛X   无线比有线TTL 有时候便于调试,虽然蓝牙一个数据包大概也就20多字节吧?也基本够用~  国产越来越适合各种,现在国产MCU继续进军车规  干掉NXP

使用特权

评论回复
11
xdqfc| | 2022-7-24 09:46 | 只看该作者
lvben5d 发表于 2022-7-24 09:42
初看了下,的确不错   这个带蓝牙 就牛X   无线比有线TTL 有时候便于调试,虽然蓝牙一个数据包大概也就20 ...

呵呵,是的是的,我用的是4.0版本,的确是20个字节,数据多的话,我就分包发送了,据说5.0的就好多了,我水平不够,只能玩4.0的了。

使用特权

评论回复
12
lvben5d|  楼主 | 2022-7-24 09:49 | 只看该作者
xdqfc 发表于 2022-7-24 09:46
呵呵,是的是的,我用的是4.0版本,的确是20个字节,数据多的话,我就分包发送了,据说5.0的就好多了,我 ...

你可以试试  学习正点原子。 推广一些这种特殊的MCU  做个开发板卖,上位机我这边可以找人一起配合。其实CH32F103C8T6 不带蓝牙,就直接可以P2P替换我的GD32,  不过我计划用AT32 因为工作温度-40~105 更好一些,我把我这个产品定位对标德国原厂那个LIN分析仪 。

使用特权

评论回复
13
vsfopen| | 2022-7-24 13:01 | 只看该作者
不管用啥芯片,windows 下的libusb也都是不支持hotplug的,这个其实和芯片没关系的

使用特权

评论回复
14
tpgf| | 2022-8-2 07:59 | 只看该作者
x64和x86到底啥意思啊

使用特权

评论回复
15
qcliu| | 2022-8-2 08:09 | 只看该作者
可以用原子哥的板子试试

使用特权

评论回复
16
drer| | 2022-8-2 08:16 | 只看该作者
请问libusb1.0.26是什么啊

使用特权

评论回复
17
coshi| | 2022-8-2 08:26 | 只看该作者
这个和版本还能有关系?

使用特权

评论回复
18
kxsi| | 2022-8-2 08:35 | 只看该作者
PID的参数真的不好配置

使用特权

评论回复
19
wiba| | 2022-8-2 09:07 | 只看该作者
这个外设功能很全 非常不错啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

746

帖子

12

粉丝