阅读:1424回复:11
接收iso数据包,顺序混乱,我该如何处理?
我用isostream方式不停的接收usb外设的数据,
我在isostreamcomplete里面copy数据到我的数据区中。 我用了两个urb包,不停的pingpong。时间长的话,有可能先发的urb0后回来,这时候isostreamcomplete就把urb1里的数据copy到数据区,然后再copy urb0的数据到数据区。这样的话,数据区里的数据先后顺序颠倒了。 我该如何处理这种问题呢? :( |
|
|
沙发#
发布于:2003-07-01 19:01
急!
顶! |
|
|
板凳#
发布于:2003-07-01 17:03
不是irp出错了,irp返回值都是对得,但是接收到几百k数据后
为什么再也不能接收数据了?irp返回值都是对得呀,我用dbgview 观察过。为什么会这样?大虾救救我!!!! :( |
|
|
地板#
发布于:2003-07-01 14:18
:D
大虾果然厉害,我改用dpc里面send,我收了889k得数据,没有一处混乱,只不过在889k处,两个irp都出错了,所以终止接收了。irp出错 能够再重用就好了,我试试。谢谢大虾醍醐灌顶!!!! |
|
|
地下室#
发布于:2003-07-01 11:30
我是程序刚开始得时候,发送irp0,irp1只有两个
然后在完成例程里面,谁到了就发谁。所以时间长的话,就会出现乱序。你是用dpc来控制这两个得顺序么?你用到dpc的话,速度能达到 多少? 我不会用dpc,能把你的代码贴出来看看么? (不好意思,上头催得太紧,提出这个请求实在无奈,你不方便的话,也没关系。能和大虾qq联系么?我的qq:469748) |
|
|
5楼#
发布于:2003-07-01 11:19
我不知道你是怎样控制你两个 URB 发送顺序的,我是用dpc (延迟调用),在完成例程中给延迟调用队列增加一个 dpc 。
如果你的完成例程中状态正确,但仍然乱序,那么你可能需要仔细检查程序的流程,确信URB发的顺序。 |
|
|
6楼#
发布于:2003-07-01 10:55
先给大虾分,小弟很急,请大虾帮人帮到底 :(
|
|
|
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); } } |
|
|
8楼#
发布于:2003-07-01 10:21
一般情况下不应该出错的,所以出错就要终止,或重置硬件。irp和urb就不一定必须重新初始化的。
|
|
|
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); } } |
|
|
10楼#
发布于:2003-07-01 09:32
如果irp0&urb0出错得话,我可不可以再次重用他们?
多谢大虾指点! :)终于碰到用过isostream的大虾了 |
|
|
11楼#
发布于:2003-07-01 08:54
我用过iso stream 方式,不会出现这种情况。
如果乱序的话,你仔细检查是否出错,如果出错一般立即返回的,这样就会导致,后发的先返回。 |
|
|