阅读:1629回复:7
关于应用程序发送读写数据的问题
请问我在应用程序中用deviceiocontrol对USB设备进行读写操作。若发了读请求后IRP已经正确地传送到了总线,但USB设备没有数据因此该读请求没有完成。此时IRP的状态该是什么样的,是successful还是一直等在那里(驱动中用的是同步IRP)?在应用程序中deviceiocontrol返回的又应是什么值?
若过了一段时间以后,USB设备有了数据,此时这个IRP是否该自动完成读数据。那么现在的IRP状态又应该是什么样的,还有应用程序中deviceiocontrol返回应是什么值? |
|
沙发#
发布于:2004-10-21 20:41
我要绝望了怎么没人回答呀
|
|
板凳#
发布于:2004-10-22 15:04
我想问问你读数据时候用ReadFile读PIPE02的数据,那么在固件程序中,这组数据是从D12_WriteEndpoint(5,16,FIFO_DATA)这个地方发出的嘛?对于端点索引和管道的对应我还不确定?谢谢
|
|
地板#
发布于:2004-10-22 16:00
我要绝望了怎么没人回答呀 1,应该是一直等在那里,直到得到数据为止,除非你的驱动中设置了超时,否则驱动程序永远不会返回,同样应用程序也不会返回,程序就像死了一样。 2,是,是返回成功(如果你的驱动没有设置超时),应用程序中的deviceiocontrol返回的应该是1 如果你想中止这个进程,可以尝试使用cancelio函数,不过前提是你前面那个请求是在子线程中发送的,否则主程序已经死了,想cancel都cancel不了了 你想随时中止某个进程请采用异步io方式,并且建议一个准消息机制,具体请参考专栏文章中TigerZD的文章。 |
|
地下室#
发布于:2004-10-25 16:38
请问jinghuiren我如果想cancelio,在驱动程序端应该怎么改呢?我的驱动程序用的是cypress开发包提供的ezusbsys.c?
我现在ezusbsys.c中加了canceli语句,应用程序中加了cancelio(),可是closehandle时程序还是死了,这说明我的IRP没有取消成功/ [quote]我要绝望了怎么没人回答呀 1,应该是一直等在那里,直到得到数据为止,除非你的驱动中设置了超时,否则驱动程序永远不会返回,同样应用程序也不会返回,程序就像死了一样。 2,是,是返回成功(如果你的驱动没有设置超时),应用程序中的deviceiocontrol返回的应该是1 如果你想中止这个进程,可以尝试使用cancelio函数,不过前提是你前面那个请求是在子线程中发送的,否则主程序已经死了,想cancel都cancel不了了 你想随时中止某个进程请采用异步io方式,并且建议一个准消息机制,具体请参考专栏文章中TigerZD的文章。 [/quote] |
|
5楼#
发布于:2004-10-28 09:52
根据USB协议,如果bulk传输中主机发了读请求下去而外设没有数据,外设返回NAK给总线;此时总线是一直等在那里呢,还是依然轮询,不断重复刚才那个请求,还是就结束了刚才那个请求?
在主机发了读请求而外设没有数据时,驱动程序中IoCallDriver()返回的状态是什么呢? [编辑 - 10/28/04 by dingdang] |
|
6楼#
发布于:2004-11-01 13:40
顶啊,大侠帮忙
|
|
7楼#
发布于:2004-11-01 14:30
jinghuiren说的对,驱动一直在等。直到有数据为止,你只有在驱动中设定超时。照他说的去找资料。
|
|