kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1424回复:11

接收iso数据包,顺序混乱,我该如何处理?

楼主#
更多 发布于:2003-06-30 17:33
我用isostream方式不停的接收usb外设的数据,
我在isostreamcomplete里面copy数据到我的数据区中。
我用了两个urb包,不停的pingpong。时间长的话,有可能先发的urb0后回来,这时候isostreamcomplete就把urb1里的数据copy到数据区,然后再copy urb0的数据到数据区。这样的话,数据区里的数据先后顺序颠倒了。

我该如何处理这种问题呢? :(
二姑家的猫想......
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-01 19:01
急!

顶!
二姑家的猫想......
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-01 17:03
不是irp出错了,irp返回值都是对得,但是接收到几百k数据后
为什么再也不能接收数据了?irp返回值都是对得呀,我用dbgview
观察过。为什么会这样?大虾救救我!!!! :(
二姑家的猫想......
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-01 14:18
 :D

大虾果然厉害,我改用dpc里面send,我收了889k得数据,没有一处混乱,只不过在889k处,两个irp都出错了,所以终止接收了。irp出错
能够再重用就好了,我试试。谢谢大虾醍醐灌顶!!!!
二姑家的猫想......
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-01 11:30
我是程序刚开始得时候,发送irp0,irp1只有两个
然后在完成例程里面,谁到了就发谁。所以时间长的话,就会出现乱序。你是用dpc来控制这两个得顺序么?你用到dpc的话,速度能达到
多少?
我不会用dpc,能把你的代码贴出来看看么?
(不好意思,上头催得太紧,提出这个请求实在无奈,你不方便的话,也没关系。能和大虾qq联系么?我的qq:469748)
二姑家的猫想......
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝1
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-01 11:19
我不知道你是怎样控制你两个 URB 发送顺序的,我是用dpc (延迟调用),在完成例程中给延迟调用队列增加一个 dpc 。
如果你的完成例程中状态正确,但仍然乱序,那么你可能需要仔细检查程序的流程,确信URB发的顺序。
你的认可是对我最大的鼓励!
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-01 10:55
先给大虾分,小弟很急,请大虾帮人帮到底 :(
二姑家的猫想......
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-07-01 10:39
我现在在IsoStreamTransferComplete做了如下修改:
请大虾帮我看看,为什么我接收得数据还是有混乱的状况?
请问你做的思路是什么样的?谢谢大虾!


NTSTATUS IsoTWStreamTransferComplete(
   IN PDEVICE_OBJECT bunkfdo,
   IN PIRP Irp,
   IN PVOID Context
   )
{

// 如果irp成功,我就根据
// urb->UrbIsochronousTransfer.IsoPacket.Length和Status
// 来copy数据到我的数据区
    if(NT_SUCCESS(Irp->IoStatus.Status))
    {
          copy.........
    }


// 如果没有stop,我继续重用irp&urb,发送下去
// 如果stop,我就释放irp&urb

    if (!pdx->StopIsoStream)
    {
       。。。。。。。。。。。
    }
    else
    {
        IoFreeIrp(Irp);
        ExFreePool(urb);
    }
}
二姑家的猫想......
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝1
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-07-01 10:21
一般情况下不应该出错的,所以出错就要终止,或重置硬件。irp和urb就不一定必须重新初始化的。
你的认可是对我最大的鼓励!
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-07-01 09:46
这是cypress所带的IsoStreamTransferComplete里面对错误的处理
如果出现错误就释放掉irp和urb,岂不是所有的irp出错的话,我要
连续接收,还必须重新初始化所有的irp和urb?盼大虾回复!!!
在线等!:(

// If no errors occured, re-initialize and re-submit the
// IRP/URB

if (NT_SUCCESS(Irp->IoStatus.Status) && !pdx->StopIsoStream)
{
。。。。。。。。。。。
}
else
{
      IoFreeIrp(Irp);
      ExFreePool(urb);

      streamObject->PendingTransfers--;
      if (streamObject->PendingTransfers == 0)
      {
         ExFreePool(streamObject->TransferBuffer);
         ExFreePool(streamObject->TransferObject);
         FreeRingBuffer(streamObject->DataRingBuffer);
         pdx->DataRingBuffer = NULL;
         FreeRingBuffer(streamObject->DescriptorRingBuffer);
         pdx->DescriptorRingBuffer = NULL;

         ExFreePool(streamObject);
      }
}
二姑家的猫想......
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-07-01 09:32
如果irp0&urb0出错得话,我可不可以再次重用他们?

多谢大虾指点! :)终于碰到用过isostream的大虾了
二姑家的猫想......
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝1
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-07-01 08:54
我用过iso stream 方式,不会出现这种情况。
如果乱序的话,你仔细检查是否出错,如果出错一般立即返回的,这样就会导致,后发的先返回。
你的认可是对我最大的鼓励!
游客

返回顶部