jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
阅读:1415回复:5

关于USB驱动里进行异步数据读写的问题

楼主#
更多 发布于:2003-08-01 14:44
我在驱动程序里建立了一个异步的URB,如下:
urb = D12_BuildAsyncRequest(DeviceObject,Irp,pipeHandle,  TRUE);
然后设置完成例程:
            IoSetCompletionRoutine(Irp,
                                   D12_AsyncReadWrite_Complete,
                                   context,
                                   TRUE,
                                   TRUE,
                                   TRUE);
之后把这个IRP发送到下层驱动:
ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);

问题:
1,如果这个IRP完成的话它会自动调用我的完成例程D12_AsyncReadWrite_Complete,然后我在完成里成立处理返回的数据是吗?
2,前面那个过程我可以循环进行吗?也就是说我发送多个IRP下去排队,那么每次队列里最多有多少个这样的IRP呢?应该有什么限制吧。
3,如果我上层应用程序是用ReadFile()来读取数据,那么这个请求发送下去之后该函数是不是会立即返回呢?也就是说不等待驱动里面的irp完成并且把数据放到我传下去的缓冲区里?


因为使用同步操作出现丢失数据现象,所以才是用异步操作,希望做过的同仁给点指导,多谢多谢!


swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝1
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-08-01 16:42
re
1、是在完成例程中处理返回的数据。
2、可以循环,但要修改一下,比如增加一个 DPC ,在完成例程中给 DPC 队列中增加一个对象,在 DPC 处理中发 IRP。
3、上层应用程序用ReadFile()来读取数据,可以同步处理,即处理完立即返回。
我觉得在 2 中你可以一直循环读取数据,放到块缓冲区中,当调用ReadFile()时,就直接从缓冲区中取数据,这样就可以同步处理了,一些实时处理都是类似这样的。


希望对你有帮助!
你的认可是对我最大的鼓励!
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝1
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-08-01 16:44
申请两个 URB 一个 URB 申请一个 IRP,循环使用,这是我们以前用过的,不会有数据丢失。其实你想想对于一个实时设备,如果驱动不连续的取数据,肯定会丢的,所以不管有无 IRP_MJ_READ 来,我们都要从设备取数据的,当有 IRP_MJ_READ 请求,这时缓冲区就有数据,所以我们就可以直接处理然后返回,我觉得这样处理简单。

我在 Kernel Mode discussion and Soft Driver 回答过了!
你的认可是对我最大的鼓励!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-01 17:18
多发了一贴
我怕你看不到吗 :D
这100分先给你了!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-01 17:19
到kernel里接着给我解答吧
williamwilliam
驱动牛犊
驱动牛犊
  • 注册日期2003-02-28
  • 最后登录2005-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-08-06 09:08
swf2003 大侠,
    是否需要在驱动程序里使用一个线程来发URB,保证时刻都有一个以上的URB在PENDING?
    能否做成232串口的MSCOMM控件一样,驱动程序自己不停的发BULK_READ的URB,一旦收到数就给应用程序发一个ON_DATA_RECEIVED消息?
    望swf2003 大侠不吝赐教。mojun163@163.com

游客

返回顶部