纬图虚拟仪器论坛

 找回密码
 立即注册
搜索
查看: 7996|回复: 0

求助QT环境下USB-CAN

[复制链接]
发表于 2015-11-16 16:59:30 | 显示全部楼层 |阅读模式
我使用GINKGO,USB-CAN适配器,在QT环境下进行2次开发
我是在一个线程死循环接收数据,主线程更新UI.
发了4000包的数据,只能更新100多包....
while(can_start)         {                     int ReadDataNum;                     int DataNum = VCI_GetReceiveNum(VCI_USBCAN2, 0, 0);                     uint32_t  SA,PF,flge;                     uint16_t t,n;                     VCI_CAN_OBJ        *pCAN_ReceiveData = (VCI_CAN_OBJ *)malloc(DataNum*sizeof(VCI_CAN_OBJ));                     if((DataNum > 0)&&(pCAN_ReceiveData != NULL))                     {                         ReadDataNum = VCI_Receive(VCI_USBCAN2, 0, 0, pCAN_ReceiveData, DataNum);                       for (int i = 0; i < ReadDataNum; i++)                         {
                    SA =   pCAN_ReceiveData[i].ID & (0xff);                    PF = ( pCAN_ReceiveData[i].ID & (0x00ff0000))>>16;                     if( can_ps == SA)                     {
                         switch(PF)                         {                         case 0x56:                             if((pCAN_ReceiveData[i].Data[0])==0x55)                                   {//收到头                                       flge=1;                                                                             SD.readbuff[0]=pCAN_ReceiveData[i].Data[1];                                       SD.readbuff[1]=pCAN_ReceiveData[i].Data[2];                                       SD.readbuff[2]=pCAN_ReceiveData[i].Data[3];                                       SD.readbuff[3]=pCAN_ReceiveData[i].Data[4];                                       SD.readbuff[4]=pCAN_ReceiveData[i].Data[5];                                       SD.readbuff[5]=pCAN_ReceiveData[i].Data[6];                                       SD.readbuff[6]=pCAN_ReceiveData[i].Data[7];                                   }                                   else if(flge==1)                                   {//收完第1包内容,开始接收第二包                                    
                                     SD.readbuff[7]=pCAN_ReceiveData[i].Data[0];                                     SD.readbuff[8]=pCAN_ReceiveData[i].Data[1];                                     SD.readbuff[9]=pCAN_ReceiveData[i].Data[2];                                     SD.readbuff[10]=pCAN_ReceiveData[i].Data[3];                                     SD.readbuff[11]=pCAN_ReceiveData[i].Data[4];                                     SD.readbuff[12]=pCAN_ReceiveData[i].Data[5];                                     SD.readbuff[13]=pCAN_ReceiveData[i].Data[6];                                     SD.readbuff[14]=pCAN_ReceiveData[i].Data[7];                                     flge=2;//第二包接收完成                                   }else if(flge==2)                                   {//收完第2包内容,开始接收第3包                                                                            SD.readbuff[15]=pCAN_ReceiveData[i].Data[0];                                      SD.readbuff[16]=pCAN_ReceiveData[i].Data[1];                                      SD.readbuff[17]=pCAN_ReceiveData[i].Data[2];                                      SD.readbuff[18]=pCAN_ReceiveData[i].Data[3];                                      SD.readbuff[19]=pCAN_ReceiveData[i].Data[4];                                      SD.readbuff[20]=pCAN_ReceiveData[i].Data[5];                                      SD.readbuff[21]=pCAN_ReceiveData[i].Data[6];                                      SD.readbuff[22]=pCAN_ReceiveData[i].Data[7];                                      flge=3;                                   }else if(flge==3)                                   {//收完第3包内容,开始接收第4包
                                                                                SD.readbuff[23]=pCAN_ReceiveData[i].Data[0];                                        SD.readbuff[24]=pCAN_ReceiveData[i].Data[1];                                        SD.readbuff[25]=pCAN_ReceiveData[i].Data[2];                                        SD.readbuff[26]=pCAN_ReceiveData[i].Data[3];                                        SD.readbuff[27]=pCAN_ReceiveData[i].Data[4];                                        SD.readbuff[28]=pCAN_ReceiveData[i].Data[5];                                        SD.readbuff[29]=pCAN_ReceiveData[i].Data[6];                                        SD.readbuff[30]=pCAN_ReceiveData[i].Data[7];                                        flge=4;                                   }else if (flge==4)                                   {//收完第4包内容,开始接收第5包
                                                                           SD.readbuff[31]=pCAN_ReceiveData[i].Data[0];                                       SD.readbuff[32]=pCAN_ReceiveData[i].Data[1];                                       SD.readbuff[33]=pCAN_ReceiveData[i].Data[2];                                       SD.readbuff[34]=pCAN_ReceiveData[i].Data[3];                                       SD.readbuff[35]=pCAN_ReceiveData[i].Data[4];                                       SD.readbuff[36]=pCAN_ReceiveData[i].Data[5];                                       SD.readbuff[37]=pCAN_ReceiveData[i].Data[6];                                       SD.readbuff[38]=pCAN_ReceiveData[i].Data[7];                                       flge=5;                                   }else if(flge==5)                                   {//收完第5包内容,开始接收第6包                                                                             SD.readbuff[39]=pCAN_ReceiveData[i].Data[0];                                       SD.readbuff[40]=pCAN_ReceiveData[i].Data[1];                                       SD.readbuff[41]=pCAN_ReceiveData[i].Data[2];                                       SD.readbuff[42]=pCAN_ReceiveData[i].Data[3];                                       SD.readbuff[43]=pCAN_ReceiveData[i].Data[4];                                       flge=0;                                       SD.flag=1;                                       if((pCAN_ReceiveData[i].Data[7])==0xAA)                                       {//收到尾                                            flge=0;                                            SD.flag=1;                                            emit Log1();//UI更新                                            //SD.readnum++;
                                       }                                   }

这是线程的程序
可以更新UI,但是不是全部都可以更新.求一个解决方法...

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|纬图虚拟仪器

GMT+8, 2024-12-22 10:01 , Processed in 0.110374 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表