yxiner
驱动牛犊
驱动牛犊
  • 注册日期2004-08-13
  • 最后登录2005-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1652回复:6

众位大侠:readfile时序的问题!能不能解决都过来看一下吧!

楼主#
更多 发布于:2005-03-23 11:06
环境:
    一款专有的特殊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]
yxiner
驱动牛犊
驱动牛犊
  • 注册日期2004-08-13
  • 最后登录2005-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-23 14:59
感觉一定是固件端的时序与驱动端的时序不太匹配的原因。
我尝试着连续执行两次readfile,这样的话,从writefile到readfile就可以连续执行下去,而不需要单步来对他延时;
但也就成功了一次,第二次又不行了,重现了上面的问题;
看起来很不稳定。。奇怪。。

是不是应该把createfile,readfile,writefile都改成异步的方式?
grehxm
驱动牛犊
驱动牛犊
  • 注册日期2005-03-20
  • 最后登录2006-12-05
  • 粉丝0
  • 关注0
  • 积分210分
  • 威望26点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-24 14:12
可以WriteFile之后就将hWrite关掉,在readfile试试,

我在做一个驱动,我单独writefile或者readfile可以,但是两个线程同时或者一个没有关闭时电脑重启,下位的设备没有什么反应。
我曾想试异步,但是读写不成功
???????????
yxiner
驱动牛犊
驱动牛犊
  • 注册日期2004-08-13
  • 最后登录2005-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-25 09:33
谢谢grehxm,不过这种方法我试过,也还是不行的。

我后来改用writefile同步,readfile异步的方式,结果是:仍然不能在没有任何延时或者断点的情况下直接读,否则,就会出现readfile已经返回,但设备端显示没有发送完毕,这样必然下一轮发送会失败;
同时,改为异步后,如果但不跟踪readfile,可以正确把结果读出来,但显示的已经读出的数据长度为0~~~如果后面再用一个GetOverlappedResult(),倒是可以得到实际读取的长度。
   为什么?
  
yxiner
驱动牛犊
驱动牛犊
  • 注册日期2004-08-13
  • 最后登录2005-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-28 21:21
这个是为什么呢?

没有人能回答吗?
版主在吗?
junki
驱动牛犊
驱动牛犊
  • 注册日期2004-09-02
  • 最后登录2007-11-30
  • 粉丝0
  • 关注0
  • 积分124分
  • 威望13点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-04-06 10:18
用这个试一试:
HidD_SetFeature,HidD_GetFeature

还有你的InputReportByteLength
    OutputReportByteLength
为多少?
yinwdgkk
驱动牛犊
驱动牛犊
  • 注册日期2005-02-22
  • 最后登录2005-04-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-04-08 15:18
yxiner:
问题如何解决的?请告知!谢谢
在为此深深苦恼
游客

返回顶部