阅读:1652回复:6
众位大侠:readfile时序的问题!能不能解决都过来看一下吧!
环境:
一款专有的特殊usb芯片,目前对他的操作就是先发送若干字节下去,固件程序接收到后,加1返回,采用同步方式,writefile使用的是PIPE00,readfile使用的是PIPE01,句柄不同;另外,用的是DO_DIRECT_IO的方式。 现象: 如果我单步执行writefile和readfile,也就是说在readfile之前留有足够的时间,就无论多大的数据都能够正确读写;但如果writefile和readfile之间没有单步,即write之后马上read,则read直接返回成功了,但事实上什么都没有读出来,而且通道组塞了,此时的固件程序端显示的是还在向主机发送数据,没有发送结束;这个时候,如果主机端再发下一轮的writefile时,自然就发送不下去了。 以下就是我createfile,writefile,readfile的代码: if(!GetUsbDeviceFileName((LPGUID)&GUID_CLASS_I82930_BULK, completeDeviceName)) { return INVALID_HANDLE_VALUE; } wcscat(completeDeviceName, TEXT(\"\\\\\")); //write时是PIPE00,read时是PIPE01。 wcscat(completeDeviceName, TEXT(\"PIPE00\")); hWrite = CreateFile(completeDeviceName,//使用PIPE00 GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); hRead = CreateFile(completeDeviceName,//使用PIPE01 GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); ret = WriteFile(hWrite, sData, sLen, &nBytesWrite, NULL); if (!ret) { CloseHandle(hRead); CloseHandle(hWrite); delete[] pinBuf; rLen = 0; return 0; } ret = ReadFile(hRead, pinBuf, rWantLen, &nBytesRead, NULL); if (!ret) { CloseHandle(hRead); CloseHandle(hWrite); DWORD ErrorCode; rLen = 0; return 0; } [编辑 - 3/23/05 by yxiner] |
|
沙发#
发布于:2005-03-23 14:59
感觉一定是固件端的时序与驱动端的时序不太匹配的原因。
我尝试着连续执行两次readfile,这样的话,从writefile到readfile就可以连续执行下去,而不需要单步来对他延时; 但也就成功了一次,第二次又不行了,重现了上面的问题; 看起来很不稳定。。奇怪。。 是不是应该把createfile,readfile,writefile都改成异步的方式? |
|
板凳#
发布于:2005-03-24 14:12
可以WriteFile之后就将hWrite关掉,在readfile试试,
我在做一个驱动,我单独writefile或者readfile可以,但是两个线程同时或者一个没有关闭时电脑重启,下位的设备没有什么反应。 我曾想试异步,但是读写不成功 |
|
|
地板#
发布于:2005-03-25 09:33
谢谢grehxm,不过这种方法我试过,也还是不行的。
我后来改用writefile同步,readfile异步的方式,结果是:仍然不能在没有任何延时或者断点的情况下直接读,否则,就会出现readfile已经返回,但设备端显示没有发送完毕,这样必然下一轮发送会失败; 同时,改为异步后,如果但不跟踪readfile,可以正确把结果读出来,但显示的已经读出的数据长度为0~~~如果后面再用一个GetOverlappedResult(),倒是可以得到实际读取的长度。 为什么? |
|
地下室#
发布于:2005-03-28 21:21
这个是为什么呢?
没有人能回答吗? 版主在吗? |
|
5楼#
发布于:2005-04-06 10:18
用这个试一试:
HidD_SetFeature,HidD_GetFeature 还有你的InputReportByteLength OutputReportByteLength 为多少? |
|
6楼#
发布于:2005-04-08 15:18
yxiner:
问题如何解决的?请告知!谢谢 在为此深深苦恼 |
|