阅读:2403回复:11
求救:如何在USB驱动中设置读数超时?
我在应用程序中向USB设备读数,有时候超过我设定的时间会读不到数据,这时候可能是设备没有响应驱动读数的要求,造成驱动一直在等待,不响应应用程序的请求,甚至关闭不了设备,不能重新打开设备。哪位高人可以指点一下迷津,在下不胜感激!能不能在驱动读数的时候设置一个超时呢?或者有没有什么办法可以强制结束驱动程序的等待,或者可不可以在应用程序中让驱动重新加载?
|
|
沙发#
发布于:2004-07-22 08:55
有没有大侠给指点一下?
|
|
板凳#
发布于:2004-07-22 19:47
我也遇到了这个问题,于是在驱动中加了一个定时器,向下层驱动传递URB前启动定时器,定时例程中放弃对当前PIPE末响应的操作,但加载后操作则蓝屏!!我认为是优先级不对,在高优先级中使用了分页内存,详细情况我也没搞清楚,也在等待高手指点!
不过还可以绕过驱动在应用程序层解决这个问题,利用多线程,一个细程进行数据传输,若超时则启动另一个线程放弃此PIPE! |
|
|
地板#
发布于:2004-07-22 21:48
呵呵,多谢老兄。不过能不能再指点一下,如何在应用程序中让那个线程放弃这个PIPE呢?好像用CloseHandle关闭句柄没有用,倒是给我返回成功了,不过不能再打开了,除非把设备拔出来:(
|
|
地下室#
发布于:2004-07-22 23:41
可以参看Driver Studio中KUsbLowerDevice::SubmitUrb()的实现
|
|
|
5楼#
发布于:2004-07-23 09:14
我也遇到这样问题,硬件缓冲区没有数据时读时挂起,后来是在应用程序做的,读数据前先写一个命令,firmware收到命令后如果缓冲区内没有数据就放入“No data",这样总能读出数据
|
|
|
6楼#
发布于:2004-07-23 09:38
To:tigerL
多谢,这就下一个DS看看 :) To:zfw 多谢老兄,不过我的好像不是没有数据读挂起,因为大概5ms就有一次数据可读,我不知道是什么地方的原因造成的现在的问题 |
|
7楼#
发布于:2004-07-24 09:17
用DeviceIoControl函数,控制码为IOCTL_Ezusb_RESETPIPE,如果你用的也是Cypress公司的驱动的话。
|
|
|
8楼#
发布于:2004-07-24 15:17
To Pixy_31:
我用的是周立功的D12,具体的不是很清楚,我是写应用程序的,驱动是公司找别人做的。驱动里也提供了Reset pipe、Reset Device的DeviceIoControl接口,不过对这个问题没用。 不知道能不能在应用程序中让驱动程序重新加载呢?因为设备重新拔掉插上就可以了,是不是那时候驱动程序就重新加载了? |
|
9楼#
发布于:2004-07-27 08:50
用waitforsigleforobject来设定超时时间
|
|
|
10楼#
发布于:2004-07-27 13:34
在驱动程序 IoCallDriver 之后?在应用程序里设置可以返回,但是驱动也能这样设吗?
|
|
11楼#
发布于:2004-08-08 20:02
不好意思,前几天一直没找到怎么给分。问题暂时是解决了。我是用"tigerL"建议的方法,参照Driver Studio中KUsbLowerDevice::SubmitUrb()的实现加了一个读数超时,谢谢各位的参与
|
|