SevenLuck
驱动牛犊
驱动牛犊
  • 注册日期2008-01-23
  • 最后登录2012-10-22
  • 粉丝2
  • 关注1
  • 积分37分
  • 威望55点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:1851回复:3

异步调用USB驱动,使用CancelIo后出现问题

楼主#
更多 发布于:2008-01-24 17:58
我写了一个USB驱动, 对应的USB芯片是68013. 主要的代码是参考 <Programming Microsoft Windows Driver Model>里的代码.

我是通过Bulk方式与USB进行通信的,并在读写的派遣例程里使用了完成函数.上层应用是通过重叠IO的异步方式对设备进行读写.

我对设备的的读写基本没问题,不过,我发现一个奇怪的现象,当我取消一个处于Pending状态的读请求后(即使用CancelIo取消这个请求), 下次再次做读请求时,有时会收不到第一次发送过来的数据,而以后发送的数据则可以正常接收.

也就是说,如果我没有使用CancelIo,那么尽管我是用异步方式读取数据的,也不会丢失任何一次到达的数据.而如果使用了CancelIo,那么很可能在接下来的读取操作中,接收不到第一次到达的数据,只能接收以后到达的数据.

不知道各位大虾是否有好的建议,多谢指点!
llss2007
驱动小牛
驱动小牛
  • 注册日期2007-09-25
  • 最后登录2010-03-16
  • 粉丝5
  • 关注0
  • 积分1001分
  • 威望123点
  • 贡献值0点
  • 好评度112点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-01-25 09:52
我帮你顶一下吧,我一直用同步的方式。不知道你是用DDK还是DRIVERSTUDIO开发驱动的?
在交流中前进
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-01-25 11:22
会不会出现出现这样的情况,你请求获得多于512字节的数据,而实际上驱动只获得了512字节的数据,于是处于pending状态等待剩余的数据
此时你cancle了这个pending的IRP,于是已经收到的这512数据和pending的IRP一起没有了
于是你的数据不能在同步,即丢掉了一个包的数据,会出现这样的情况吗?

如果你得读写操作每次都是以512字节为最大单位,那这种情况是不会出现的
misschen2007
驱动牛犊
驱动牛犊
  • 注册日期2008-01-26
  • 最后登录2008-03-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-01-26 09:46
在这里 http://www.usbing.net  看看,一定对你有帮助。
游客

返回顶部