免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7296 | 回复: 1
打印 上一主题 下一主题

[C] libusb的usb_bulk_read问题,请高手指点 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-22 10:59 |只看该作者 |倒序浏览
前几天在做一个usbkey的linux下静态库访问接口,遇到点很奇怪的问题,一直没能解决,所以发到论坛上问问,欢迎高手指点

写了一个测试程序来测试写好的静态库   gcc -o test_s.bin test.o libMyKEY.a

运行现象:
第一次运行./test_s.bin,工作正常,正常结束,但接着再运行一次,就会阻塞在usb_bulk_read上了,强行拔掉usbkey后,才会返回通讯错误

写操作是这样写的:
TransLength = usb_bulk_write(handle, 0x02, (char*)&HIDSendBuf, sizeof(struct HID_BUFFER), 1000);

读操作是这样写的:
TransLength = usb_bulk_read(handle, 0x81, (char*)&HIDSendBuf, sizeof(struct HID_BUFFER), 0);

在读写操作的前后没有使用usb_claim_interface(handle, 0)和usb_release_interface(handle, 0),因为加上这两句,第一次运行就会阻塞在usb_bulk_read上了,也就是说好象不能使用这两句,不知为什么

枚举和打开设备的相关代码应该没问题:
Enum时:
usb_find_busses();
usb_find_devices();
usbhandle = usb_open(dev);
usb_detach_kernel_driver_np(usbhandle,0);
usb_close(usbhandle);

Open时:
usbhandle = usb_open(dev);

Close时
usb_close(usbhandle);

论坛徽章:
0
2 [报告]
发表于 2009-06-22 11:27 |只看该作者
刚才试了一下,尝试在Enum时这样写,貌似能解决问题,但还是不支持两个进程同时打开访问一把锁,应该这样处理是有问题的
Enum时:
usb_find_busses();
usb_find_devices();
usbhandle = usb_open(dev);
usb_reset(usbhandle);   //加上这一句第二次运行./test_s.bin就不会阻塞了
usb_detach_kernel_driver_np(usbhandle,0);
usb_close(usbhandle);

按刚才的处理,多次运行./test_s.bin正常,但同时运行两个test_s.bin时还是有问题,即两个进程同时打开一把锁时还是有问题,后打开锁的进程能正常结束,先打开锁的进程会通讯错误

debug了一下,先打开锁的进程返回的错误是:
USB error: error submitting URB:  Device or resource busy
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP