w_glacier
驱动牛犊
驱动牛犊
  • 注册日期2004-07-21
  • 最后登录2005-09-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2403回复:11

求救:如何在USB驱动中设置读数超时?

楼主#
更多 发布于:2004-07-21 17:13
我在应用程序中向USB设备读数,有时候超过我设定的时间会读不到数据,这时候可能是设备没有响应驱动读数的要求,造成驱动一直在等待,不响应应用程序的请求,甚至关闭不了设备,不能重新打开设备。哪位高人可以指点一下迷津,在下不胜感激!能不能在驱动读数的时候设置一个超时呢?或者有没有什么办法可以强制结束驱动程序的等待,或者可不可以在应用程序中让驱动重新加载?
w_glacier
驱动牛犊
驱动牛犊
  • 注册日期2004-07-21
  • 最后登录2005-09-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-07-22 08:55
有没有大侠给指点一下?
Pixy_31
驱动牛犊
驱动牛犊
  • 注册日期2004-05-29
  • 最后登录2005-04-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-22 19:47
我也遇到了这个问题,于是在驱动中加了一个定时器,向下层驱动传递URB前启动定时器,定时例程中放弃对当前PIPE末响应的操作,但加载后操作则蓝屏!!我认为是优先级不对,在高优先级中使用了分页内存,详细情况我也没搞清楚,也在等待高手指点!
不过还可以绕过驱动在应用程序层解决这个问题,利用多线程,一个细程进行数据传输,若超时则启动另一个线程放弃此PIPE!
小妖在此
w_glacier
驱动牛犊
驱动牛犊
  • 注册日期2004-07-21
  • 最后登录2005-09-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-07-22 21:48
呵呵,多谢老兄。不过能不能再指点一下,如何在应用程序中让那个线程放弃这个PIPE呢?好像用CloseHandle关闭句柄没有用,倒是给我返回成功了,不过不能再打开了,除非把设备拔出来:(
tigerL
驱动小牛
驱动小牛
  • 注册日期2003-12-24
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望23点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-07-22 23:41
可以参看Driver Studio中KUsbLowerDevice::SubmitUrb()的实现
省元坊
zfw
zfw
驱动小牛
驱动小牛
  • 注册日期2001-12-16
  • 最后登录2006-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-07-23 09:14
我也遇到这样问题,硬件缓冲区没有数据时读时挂起,后来是在应用程序做的,读数据前先写一个命令,firmware收到命令后如果缓冲区内没有数据就放入“No data",这样总能读出数据
zfw
w_glacier
驱动牛犊
驱动牛犊
  • 注册日期2004-07-21
  • 最后登录2005-09-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-07-23 09:38
To:tigerL
多谢,这就下一个DS看看 :)

To:zfw
多谢老兄,不过我的好像不是没有数据读挂起,因为大概5ms就有一次数据可读,我不知道是什么地方的原因造成的现在的问题
Pixy_31
驱动牛犊
驱动牛犊
  • 注册日期2004-05-29
  • 最后登录2005-04-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-07-24 09:17
用DeviceIoControl函数,控制码为IOCTL_Ezusb_RESETPIPE,如果你用的也是Cypress公司的驱动的话。
小妖在此
w_glacier
驱动牛犊
驱动牛犊
  • 注册日期2004-07-21
  • 最后登录2005-09-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-07-24 15:17
To Pixy_31:
我用的是周立功的D12,具体的不是很清楚,我是写应用程序的,驱动是公司找别人做的。驱动里也提供了Reset pipe、Reset Device的DeviceIoControl接口,不过对这个问题没用。
不知道能不能在应用程序中让驱动程序重新加载呢?因为设备重新拔掉插上就可以了,是不是那时候驱动程序就重新加载了?
zzq191
驱动中牛
驱动中牛
  • 注册日期2001-08-09
  • 最后登录2018-05-29
  • 粉丝17
  • 关注0
  • 积分1041分
  • 威望716点
  • 贡献值0点
  • 好评度318点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2004-07-27 08:50
用waitforsigleforobject来设定超时时间
QQ:416331891,承接windows下应用和驱动的开发,雅虎通:zzq191, Email:zzq191@21cn.com
w_glacier
驱动牛犊
驱动牛犊
  • 注册日期2004-07-21
  • 最后登录2005-09-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-07-27 13:34
在驱动程序 IoCallDriver 之后?在应用程序里设置可以返回,但是驱动也能这样设吗?
w_glacier
驱动牛犊
驱动牛犊
  • 注册日期2004-07-21
  • 最后登录2005-09-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-08-08 20:02
不好意思,前几天一直没找到怎么给分。问题暂时是解决了。我是用"tigerL"建议的方法,参照Driver Studio中KUsbLowerDevice::SubmitUrb()的实现加了一个读数超时,谢谢各位的参与
游客

返回顶部