seeseadream
驱动牛犊
驱动牛犊
  • 注册日期2003-10-06
  • 最后登录2005-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1646回复:8

问一个和cypress68013有关的应用程序问题

楼主#
更多 发布于:2003-10-10 00:17
在应用程序中,我使用的是DeviceIoControl 与下层驱动通信, 已经调通。使用的是BULK方式, 一帧最大数据量是64KB。使用一个while死循环来实现数据的下传, 但是如果硬件由于一些原因, 缓存满了, 那么应用程序就有可能堵塞在DeviceIoControl 上, 从而使得该线程被挂起,请问如何解决这个可能出现的问题?谢谢
愿与你分享成功的喜悦、失败的悲哀!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-10-10 14:31
不太明白你的意思!
我想问如果你检查到设备端点为满想怎么办?
是退出程序呢还是报错还是等待???
如果你想知道你的驱动里面是否使用的是异步方式,那就在驱动源代码中搜索IoMarkPending()函数,如果你用的cy的驱动,并且没有改动的话驱动肯定是同步的,它反映到应用程序中的现象就是如果设备端端点为满,程序就停止在deviceiocontrol函数上,其实这是驱动在等待完成本次操作,完成后返回,否则就一直停止在那里!

既然你做的是打印机的东西,那么我想你应该在程序中记录你成功完成的数据传输,如果设备端停掉了,那下次传输就不要再传已经完成的了,如果你想传3g的数据,那你的数据一定是存在文件中的,读文件从哪里读都行的!断点续传呀。

最后一点,我想你的驱动肯定是同步的,关于同步和异步的区别你可以参考walter oney的programming the microsoft windows driver model第9章的“I/O控制操作”一节,我想你的情况用异步的会好一下,至少你不需要每次都强制结束程序!

ps:坛子里有很多关于异步irp的贴子,搜出来看看吧。
seeseadream
驱动牛犊
驱动牛犊
  • 注册日期2003-10-06
  • 最后登录2005-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-10 12:27
你应该看出,在我的应用程序中已经使用了一种方式来判断下面的硬件的端点缓存还有没有空间, 但这是从应用程序角度去捕捉的, 我希望的是,能够从下层返回一个信号, 就象ACK,NAK,STALL那样的信号,来告诉我还有没有空间, 还要不要发数据。不然的话,一旦下层无空间,而上层无法知道,仍旧在不断的发数据, 就一直挂在那了,准确的说是一直挂在DeviceIoControl 上了, 每次返回0字节。
所以我想问一下, 如何从下层捕捉到这么一个表示下层端点缓存空间状态的信号?谢谢
愿与你分享成功的喜悦、失败的悲哀!
seeseadream
驱动牛犊
驱动牛犊
  • 注册日期2003-10-06
  • 最后登录2005-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-10-10 12:19
驱动使用BULK 的异步方式, 应用程序是轮询方式,FX2下面如果用CPLD简单的将收到的数据立即丢掉,那么我的整个程序一下问题都没有,问题是, 如果我一下子要传3G的数据, 不可能一下子写进系统缓冲, 也不可能一下子传到端点缓存中。 我的原程序如下: while(cycle)
{

if(WaitForSingleObject(m_hEndEvent,1000)==WAIT_OBJECT_0)
{
CloseIfOpen();
AfxEndThread(1);
}
else
{ BULK_TRANSFER_CONTROL bulkControl;
BYTE *  bufInput = new BYTE [size];
bulkControl.pipeNum=0;
bResult=DeviceIoControl(hDevice,
IOCTL_EZUSB_BULK_WRITE,
&bulkControl,
sizeof(BULK_TRANSFER_CONTROL),
bufInput,
size ,
&nBytes,
NULL);
if (bResult==FALSE)
 {
info.Format(\"DeviceIoControl Fail:%x\",GetLastError());
SendMessage(pStMsg->hwnd,pStMsg->msg,MSG_INFO,(LPARAM)&info);
SetEvent(m_hEndEvent);
return 0;
}
else if(nBytes==0)
{
count++;
if(count==1)
tick1=GetTickCount();
Sleep(2000);
if(count==10)
{
tick2=GetTickCount();
if((tick2-tick1)<25000)
cycle=false;
}
}
     else
{
lPackages ++;
info.Format(\"正在发送第%ld/%ld包数据\",lPackages,headCtrl.m_lTotalPackages);
SendMessage(pStMsg->hwnd,pStMsg->msg,MSG_INFO,(LPARAM)&info);
if(pProgressCtrl != NULL)
{
pProgressCtrl->StepIt();
}
if(lPackages >= headCtrl.m_lTotalPackages){
SetEvent(
m_hEndEvent);
Sleep(5000);//等待
SendMessage(pStMsg->hwnd,pStMsg->msg,MSG_PRINT_END,NULL);
if(pProgressCtrl != NULL){
pProgressCtrl->SetPos(headCtrl.m_lTotalPackages + 1);

愿与你分享成功的喜悦、失败的悲哀!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-10-10 11:37
我也是用DeviceIoControl来实现数据的读写, 但是我做的项目是为打印机传数据, 可能遇到数据量很大的情况,或者下面硬件出现异常,这时候,USB是不工作了,但是应用程序一直在轮询接口,从而,被挂起,我的机理如下
while(true)
{
bResult=DeviceIoControl(hDevice,
IOCTL_EZUSB_BULK_WRITE,
&bulkControl,
sizeof(BULK_TRANSFER_CONTROL),
bufInput,
size ,
&nBytes,
NULL);
。。。。}

使用的是异步方式。
 



好像~~~好像,你上面的方法是同步的,如果你没有修改过cy的驱动程序的话,你这样没有错误检测的循环当然有问题了,你得检查bResult的值,如果时1的话循环,如果时0的话就报错跳出循环(前提是你驱动里用的是同步模式,如果是异步的话,用GetLastError()得到错误码,如果是STATUS_PENDING,则循环等待数据,否则就报错结束)
jewelry
驱动牛犊
驱动牛犊
  • 注册日期2003-07-28
  • 最后登录2005-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-10-10 10:08
seaseadream,我们讨论一下应用程序和驱动程序好吗,不过我是新手,不太懂!我的QQ是44313181。
seeseadream
驱动牛犊
驱动牛犊
  • 注册日期2003-10-06
  • 最后登录2005-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-10-10 09:47
我也是用DeviceIoControl来实现数据的读写, 但是我做的项目是为打印机传数据, 可能遇到数据量很大的情况,或者下面硬件出现异常,这时候,USB是不工作了,但是应用程序一直在轮询接口,从而,被挂起,我的机理如下
while(true)
{
bResult=DeviceIoControl(hDevice,
IOCTL_EZUSB_BULK_WRITE,
&bulkControl,
sizeof(BULK_TRANSFER_CONTROL),
bufInput,
size ,
&nBytes,
NULL);
。。。。}

使用的是异步方式。
愿与你分享成功的喜悦、失败的悲哀!
jewelry
驱动牛犊
驱动牛犊
  • 注册日期2003-07-28
  • 最后登录2005-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-10-10 09:39
在应用程序中,我使用的是DeviceIoControl 与下层驱动通信, 已经调通。

请问具体你是怎么实现上层与下层通信的?应用程序和驱动各应怎么做?
lioniamhero
驱动小牛
驱动小牛
  • 注册日期2003-05-31
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-10-10 07:58
你的while是在驱动还是应用里呢。
在应用和驱动里你都要加标志来控制线程的运行。
你不是实时接收数据的吧。
游客

返回顶部