yuchixiao
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2007-01-22
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1409回复:8

有没有人遇到过读写字节只有64k的问题

楼主#
更多 发布于:2004-02-19 13:36
我是d12+430的硬件,用ds3.0beta2板生成的驱动,端点1bulk out,端点2bulk in。
可是遇到这样的问题:不管是端点1还是端点2,当主机发送或者接收了64k字节的数据后,就会发出总线复位,主机弹出不安全删除设备窗口。。
谁能帮我指点一下?
我是一条鱼
yuchixiao
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2007-01-22
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-02-23 10:01
固件应该没问题,因为设备掉线以后又重新枚举上了,只是应用程序的句柄已经关闭了,而且必须再热插拔一次才能重新打开句柄,是不是驱动的问题?
我是一条鱼
zhuge36
驱动牛犊
驱动牛犊
  • 注册日期2003-07-18
  • 最后登录2010-10-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望31点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-02-21 14:40
1.固件会不会有问题?能否正确收到数据?
2.用DWORD dError=GetLastError();看看返回了什么错误,在VC帮助中查看原因。
3.GetOverlappedResult()请看帮助,我没有研究。
4.异步调用只能有一个实例,但立即返回,不会一直等待。
yuchixiao
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2007-01-22
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-02-20 18:02


这是写了64k字节后,设备弹出不安全删除窗口时的截图。
 [img]
C:\Documents and Settings\sliang.FLXDOMAIN\桌面\未命名1.bmp
[/img]
我是一条鱼
yuchixiao
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2007-01-22
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-02-20 17:52
下面是我按照《Windows 2000/XP WDM设备驱动程序开发》第五章p79给的例程将应用程序改为异步方式调用后的写子程序。

问题还是和以前的一样,不过这回能看到设备在主机发送了64k字节后句柄关闭,应用程序窗口输出ERROR: ????????????? in writting。此时无法重新打开应用程序,不过bushund 抓的数据显示设备不安全删除后已重新枚举成功。

问题:1。谁能告诉我异步方式和同步方式的区别,这里应该用哪一种;
     2。GetOverlappedResult(hDevice,&ol,&nWritten,FALSE)这个函数有什么作用?出错的原因是什么。
      3。为什么设备重新枚举成功了,还是打不开句柄??

多谢了!





void doWrite(char *command, int n)
{
char *buf;
ULONG nWritten;
int i;
int j;



OVERLAPPED ol;
ol.Offset=0;
ol.OffsetHigh=0;
ol.hEvent=IOWaiter;

BOOL KeepRunning;
KeepRunning=TRUE;


buf = (char *) malloc(n);
if (buf == NULL)
{
printf("Failed to allocate buffer for write");
Exit(1);
}

// // start with the mod26 letter of the number of bytes to write
// j = (n % 26);
// // load buffer with dummy data (abcdefg...)
// for (i=0; i<n; i++, j=(j + 1)%26)
// {
// buf = 'a' + j;
// }

for (i=0;i<n;i++)
{
buf=command;
}



ResetEvent(IOWaiter);
// Write data to driver
// printf("Writing to device - ");
if(!WriteFile(hDevice, buf, n, &nWritten, &ol))
{
if(GetLastError()!=ERROR_IO_PENDING)
{
printf("ERROR: Fatal Error writting.\n");
}

while(WaitForSingleObject(IOWaiter,100)==WAIT_TIMEOUT)
{
if(!KeepRunning)
{
//Cancel the pending read
CancelIo(hDevice);
Exit(1);
}

}

if(!GetOverlappedResult(hDevice,&ol,&nWritten,FALSE))
{
printf("ERROR: ????????????? in writting.\n");
}

};



// printf("%d bytes written to device (%d attempted).\n", nWritten, n);

// Print what was written
/* i = 0;
for(i=0;i<n; i++)
{
printf("%c, ", buf);
} */
printf("\n");

free(buf);
}
我是一条鱼
yuchixiao
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2007-01-22
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-02-20 09:27
多谢两位回复,不过我肯定没有做字节限制。

设备掉了以后,应用程序打开的句柄好像也关闭了(再发数据,总线上都没有)。我停下固件端程序,发现中断寄存器的值是F4H(总线复位,挂起改变,主端点输入、输出,端点1输出),最后状态寄存器的值是44H(编码有效,PID不存在)。

可是我只用到了主端点入(BULK),会不会是生成的驱动的问题,我用的是DS3.0beta版,打算用2。7重生成一个试试。。。
我是一条鱼
hfy781108
驱动牛犊
驱动牛犊
  • 注册日期2002-08-19
  • 最后登录2005-12-10
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-02-20 09:27
我看过68013的驱动,,驱动中有对一次最大传输字节做限制
pengenwen
禁止发言
禁止发言
  • 注册日期2003-03-07
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分1586分
  • 威望8380点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-02-20 09:00
用户被禁言,该主题自动屏蔽!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-02-19 19:39
检查一下你设备固件程序里是否接收了那么多数据后把软连接给断掉了!
游客

返回顶部