Qt中realAll() 接收数据不完整的问题

解决realAll() 接收数据不完整的问题
在帧尾增加一个判断即可

QByteArray byteArray;  //声明全局变量
 QByteArray temp = serial->readAll();  

   if(!temp.isEmpty())
     {
        byteArray.append(temp); //在字符串后面增加字符
        if(byteArray.contains('#')) //数据后面是否包含‘#’
        {
           ui->lineEdit_3->setText(QString(byteArray));//
           ui->lineEdit_4->setText(byteArray);//等效上一句
         byteArray="";//重置储存数组 ,清空
        }
     }

Qt中realAll() 接收数据不完整的问题_第1张图片

//参考1,这个函数是 只检查帧尾
void thread_data::readMyCom()
{
    QByteArray temp = myCom->readAll();
    if(!temp.isEmpty())
       {
           emit data_transfer(temp);
           byteArray.append(temp);//在字符串后面增加字符
           if(byteArray.contains(end_flag))//是否含有这一字符串 是的话返回1
           {
               byteArray = byteArray.left(byteArray.length()-5);//减少左边五个字符
               if(byteArray.length()>10)
               {
                   transition(byteArray);//转化图像能在电脑上显示,自定义的函数transition();
               }
               byteArray="";//重置储存数组
               myCom->write("#");//准备下一次发送
           }
       }
}
//参考函数2  该函数是 检查帧头和帧尾函数
void MainWindow::readMyCom_f()//分析来自服务器的数据
{
    QByteArray t= myCom_f->readAll();
    QString temp=QString(t);
    if(!temp.isEmpty())
    {
        ui->test_1->append(temp);
        if(temp_data_flag==0)temp_data_flag=-1;
        while(1)
        {
            int t;
            if(temp_data_flag==1)
            {
               t=temp.indexOf("@",0);
               if(t==-1)break;
               else
               {
                   temp=temp.right(temp.length()-t-1);
                   temp_data.append(temp);
                   temp_data=handle(temp_data);
               }
            }
            else if(temp_data_flag==-1)
            {
                temp_data.append(temp);
                temp_data=handle(temp_data);
            }
            else if(temp_data_flag==0)break;
        }
    }
}
QString MainWindow::handle(QString temp)//处理命令
{
   int t=temp.indexOf("#",0);
   if(t==-1)
   {
       temp_data_flag=0;
   }
   else
   {
       temp_data_flag=1;
       temp.truncate(temp.indexOf("#",0));
       ui->test_1->setText(temp);
       switch (run_flag){
       //处理数据
       case 0:
           set_data_2(comman(temp));//接收控制数据并且将控制数据发送到zigbee
           run_flag=1;
           writMyCom_f_data("E"+QString::number(num_flag));
           break;
       case 1:
           set_data(comman(temp));
           run_flag=2;
           break;
       case 2:
               if(temp[3]=='F')
               {
                   ser_data(comman(temp));
                   if(QString(temp[4])==QString::number(num_flag))
                       writMyCom_f_data("E"+QString::number(num_flag));
               }
               else if(temp[3]=='E')
                   set_data(comman(temp));

           break;
       default:
           break;
       }
       temp.clear();
   }
   return temp;
}

你可能感兴趣的:(QT学习笔记)