EZ-USB FX2(68013)Cyapi使用心得(4)--bulk传输_学与玩_百度空间

           今天有空写以下bulk传输。bulk的话,cy开发包里有个例子cybulk写的很好,不过说实话,那个太烦琐了,基本上我们自己只用到其中的一部分,另外,就是局限性很大,例如它只是512字节的倍数,对于任意数目的字节貌似是不支持的,数据会不同步。

           为了提高传输速度与效率,一般要把数据采集放在另外一个线程,单独开启一个bulk线程。恩,前面的还是稍微提一下,在打开USB,设定端点后,紧接着开启线程,进行bulk采集:

         if (USBDevice->IsOpen()) {   //如果USB设备已经打开
           bLooping = true;      //线程循环标志为真
          XferThread = AfxBeginThread(XferLoop, this); //启动线程
           }

        然后是线程中的处理,在这里上位机用异步接收,创建异步事件:

      OVERLAPPED inOvLap;
     CVC_SimpleCyapiDlg *dlg = (CVC_SimpleCyapiDlg *) params;   //使该线程可访问CBulkLoopDlg类的所 有公有成员

     inOvLap.hEvent   = CreateEvent(NULL, false, false, "CYUSB_IN");

     线程循环:

    bool success;

dlg->InEndpt->TimeOut = 120;


for (;dlg->bLooping;) {       //线程循环,直到循环标志blooping为假
   LONG inlen ;
   inlen = 512;
   UCHAR *inContext = dlg->InEndpt->BeginDataXfer(inData,inlen,&inOvLap);
  
        dlg->InEndpt->WaitForXfer(&inOvLap,TimeOut);
        success = dlg->InEndpt->FinishDataXfer(inData,inlen, &inOvLap,inContext);
     if (!success) dlg->bLooping = false;
}

      主要是三步,调用三个函数BeginDataXfer,WaitForXfer,FinishDataXfer。按照手册上说的,BeginDataXfer发起异步传输,并且立即返回。也就是说,发起此次的inlen后,并不会等inlen传输完,而是立即开始下一次inlen字节传输;WaitForXfer,异步传输{zd0}等待时间;FinishDataXfer,到这里才开始真正的写内存,将读到的数写到缓冲区indata中。

      {zh1},完了别忘记释放对象:

     CloseHandle(inOvLap.hEvent);

     delete [] inData;

     另外,如果要传输非512字节整数倍的数据,而且不是一次传输完的话,{zh0}在线程中用SetXferSize()重新设置传输大小,否则会导致数据不同步。

       好了,写到这里,本来以前写了个bulk数据采集简单的例子的,可惜baidu传不了附件,呵呵。。。。。。

                                                                                                                               【谷】  

                                    

   


3 2009-12-15 00:33 |
您好!请教一个问题,为什么我在线程中对dlg->InEndpt的任何一个变量进行操作都会报错呢?比如将执行下面这个语句,
dlg->InEndpt->TimeOut = 120;
报错内容:Unhandled exception at 0x004137d8 in Usb_test.exe: 0xC0000005: Access violation writing location 0xccccccdc.请赐教!谢谢
4 2009-12-15 11:41 |
      我也碰到过这种错误,有时在头文件里定义类变量时加个注释,去掉注释,就运行就报内存错误了,跟踪就是你那样,错误执行dlg->....timeout...
     特别是你如果直接用cybulk的模板修改的话,更容易出现内存错误,好像是MFC设置和cyapi库兼容冲突问题。后来我一般都是自己建新的MFC模板,使用MFC默认设置就没问题了。
9 2009-12-31 15:19 |
新手来请教,BeginDataXfer是异步传输,如果我想传1024个字节的话,是不是inLen=1024,然后inData申请1024个字节就行了。还是说inLen{zd0}只能设置为512,然后Loop循环两次,然后停止传输。自己感觉是后一种吧,这样才符合你说的,BeginDataXfer执行以后,立即返回,发起下一次传输。但是立即返回以后,执行的是WaitForXfer,是等待啊,如何发起下一次传输啊?期待您的解答
23 2010-01-15 19:47 |
再次来请教,请问cyapi怎么做超时处理啊?
WaitForXfer(&inOvLap,TimeOut),我也使用这个函数,但是好像如果下位机没有发送数据的时候,上位机一直在等着啊,我的TimeOut设置为2000了,没有收到数据后,我关掉应用程序,发现任务管理器中还在运行呢,并且线程结束后我使用了CloseHandle(inOvLap.hEvent); 还把USB设备Close了。这是什么原因呢?

郑重声明:资讯 【EZ-USB FX2(68013)Cyapi使用心得(4)--bulk传输_学与玩_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——