找回密码
 立即注册
收起左侧

数据显示时,程序突然崩溃

8
回复
4478
查看
[复制链接]

尚未签到

来源: 2018-11-27 19:59:15 显示全部楼层 |阅读模式
5Qter豆
在UI界面上显示了几个数据后,程序突然崩溃,反馈信息为ASSERT: "uint(i) < uint(size())" in file ..\..\..\QT\5.6\mingw49_32\include/QtCore/qbytearray.h, line 470D:\GUI\lianxi\11 27\debug\maker.exe exited with code 3。代码如下
//读取接收到的数据
void MyMainWindow::Read_Data()
{
    QApplication::setOverrideCursor(Qt::WaitCursor);
    QElapsedTimer et;
    QByteArray buf;
    QByteArray temp_buf;
    QByteArray temp;
    QByteArray PasteData;
    QByteArray kjs;
    QPalette pal(ui->widget_1->palette());
    QPalette pal2(ui->widget_2->palette());
    QPalette pal3(ui->widget_3->palette());
    QElapsedTimer t;
    //int i=0;
    int h1=0,h2=0;
     temp_buf= serial->readAll();
     //异常类:无头且变量为空,已丢失头部,数据不可靠,直接返回
     if ((!temp_buf.contains("{"))&(PasteData.isNull()))
     {
     return;
     }
     //第一种:有头无尾,先清空原有内容,再附加
     if ((temp_buf.contains("{"))&(!temp_buf.contains("}")))
     {
     PasteData.clear();
     PasteData.append(temp_buf);
     }
     //第二种:无头无尾且变量已有内容,数据中段部分,继续附加即可
     if ((!temp_buf.contains("{"))&(!temp_buf.contains("}"))&(!PasteData.isNull()))
     {
     PasteData.append(temp_buf);
     }
     //第三种:无头有尾且变量已有内容,已完整读取,附加后输出数据,并清空变量
     if ((!temp_buf.contains("{"))&(temp_buf.contains("}"))&(!PasteData.isNull()))
     {
     PasteData.append(temp_buf);
     buf = PasteData;
     PasteData.clear();
     }
     //第四种:有头有尾(一段完整的内容),先清空原有内容,再附加,然后输出,最后清空变量
     if ((temp_buf.contains("{"))&(temp_buf.contains("}")))
     {
        if(temp_buf.at(0)==123)
         {
         if(temp_buf.at(3)==0||temp_buf.at(3)==1)
          {
          PasteData.clear();
          temp = temp_buf.left(5);
          PasteData.append(temp_buf);
          buf = PasteData;
          PasteData.clear();
          QApplication::restoreOverrideCursor();
         }
        }
        else return;
    }
     h1=buf.length();
     QApplication::setOverrideCursor(Qt::WaitCursor);
         et.start();
         QDataStream out(&buf,QIODevice::ReadWrite);    //将字节数组读入
         qint8 outChar = 0;
         out>>outChar;   //每字节填充一次,直到结束
         QString str = QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0'));//十六进制的转换
         ui->textEdit->insertPlainText(str.toUpper());//大写
         ui->textEdit->insertPlainText(" ");//每发送两个字符后添加一个空格
         ui->textEdit->moveCursor(QTextCursor::End);
         kjs = buf;
                if(kjs.at(1)==0)//0X00表示停机
                {
                pal.setColor(QPalette::Background, Qt::yellow); //设置背景黄色
                ui->widget_1->setAutoFillBackground(true);
                ui->widget_1->setPalette(pal);
                ui->widget_1->show();
                t.start();
                while(t.elapsed()<100);//停机
                {
                    if(kjs.at(1)==0)
                    {
                        pal.setColor(QPalette::Background, Qt::red); //设置背景红色
                        ui->widget_1->setAutoFillBackground(true);
                        ui->widget_1->setPalette(pal);
                        ui->widget_1->show();
                    }
                }
            }
            else if(kjs.at(1)==1)
            {

                pal.setColor(QPalette::Background, Qt::green); //设置背景绿色
                ui->widget_1->setAutoFillBackground(true);
                ui->widget_1->setPalette(pal);
                ui->widget_1->show();
            }
            else
            {

                pal.setColor(QPalette::Background, Qt::gray); //设置背景灰色
                ui->widget_1->setAutoFillBackground(true);
                ui->widget_1->setPalette(pal);
                ui->widget_1->show();
            }
           if(kjs.at(2)==0)//0X00表示停机
           {

                pal2.setColor(QPalette::Background, Qt::yellow); //设置背景黄色
                ui->widget_2->setAutoFillBackground(true);
                ui->widget_2->setPalette(pal2);
                ui->widget_2->show();
                t.start();
                while(t.elapsed()<100);//停机
                {
                    if(kjs.at(2)==0)
                    {
                        pal2.setColor(QPalette::Background, Qt::red); //设置背景红色
                        ui->widget_2->setAutoFillBackground(true);
                        ui->widget_2->setPalette(pal2);
                        ui->widget_2->show();
                    }
                }
            }
            else if(kjs.at(2)==1)
            {
                pal2.setColor(QPalette::Background, Qt::green); //设置背景绿色
                ui->widget_2->setAutoFillBackground(true);
                ui->widget_2->setPalette(pal2);
                ui->widget_2->show();
            }
            else
            {
                pal2.setColor(QPalette::Background, Qt::gray); //设置背景灰色
                ui->widget_2->setAutoFillBackground(true);
                ui->widget_2->setPalette(pal2);
                ui->widget_2->show();
            }
           if(kjs.at(3)==0)//0X00表示停机
           {
                pal3.setColor(QPalette::Background, Qt::yellow); //设置背景黄色
                ui->widget_3->setAutoFillBackground(true);
                ui->widget_3->setPalette(pal3);
                ui->widget_3->show();
                t.start();
                while(t.elapsed()<100);//停机
                {
                    if(kjs.at(3)==0)
                    {
                        pal3.setColor(QPalette::Background, Qt::red); //设置背景红色
                        ui->widget_3->setAutoFillBackground(true);
                        ui->widget_3->setPalette(pal);
                        ui->widget_3->show();
                    }
                }
            }
            else if(kjs.at(3)==1)
            {
                pal3.setColor(QPalette::Background, Qt::green); //设置背景绿色
                ui->widget_3->setAutoFillBackground(true);
                ui->widget_3->setPalette(pal3);
                ui->widget_3->show();
            }
            else
            {
                pal3.setColor(QPalette::Background, Qt::gray); //设置背景灰色
                ui->widget_3->setAutoFillBackground(true);
                ui->widget_3->setPalette(pal3);
                ui->widget_3->show();
            }
           buf=buf.right(buf.size()-5);
           h2=buf.length();
           QApplication::restoreOverrideCursor();
           buf.clear();
}

回复

使用道具 举报

尚未签到

2018-11-29 20:58:49 显示全部楼层
在开头给数组设置了容量为5即 buf.resize(5);就不报错了,但是接收到的数据大多为乱码,请问各位大大是为什么[code]"界面设定成功!"
"{\x00\x05\x00}"
"\xAA\x00\x00\x00"
"QLab"
"QWid"
"2\x00""8\x00"
"QWid"
"QLab"
"QLab"
"QLab"
"QLab"
"QWid"
"QWid"
"QWid"
"\x00\x00\x00\x00"
"\x00\x00\x00\x00"
"QWid"
"\x00\x00\x00\x00"
"QWid"
"\x00\x00\x00\x00"
"{\x00\x05\x00}"
"\x03\x00\x00\x00"
"\x00\x00\x00\x00"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"p\"i\x15"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"\x00\x00\x00\x00"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QLab"
"QWid"
"QWid"
"QLab"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"\xAA\x00\x00\x00"
"i\x00\x00\x00"
"QWid"
"QLab"
"QLab"
"QLab"
"QWid"
"QLab"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
"QWid"
回复

使用道具 举报

尚未签到

2018-11-27 20:39:17 显示全部楼层
查了好几遍,真没发现啥超出容量的东西
  1. void MyMainWindow::Read_Data()
  2. {
  3.     QApplication::setOverrideCursor(Qt::WaitCursor);
  4.     QByteArray buf;
  5.     QByteArray temp_buf;
  6.     QByteArray temp;
  7.     QByteArray PasteData;
  8.     QPalette pal(ui->widget_1->palette());
  9.     QPalette pal2(ui->widget_2->palette());
  10.     QPalette pal3(ui->widget_3->palette());
  11.     QElapsedTimer t;
  12.      temp_buf= serial->readAll();
  13.      //异常类:无头且变量为空,已丢失头部,数据不可靠,直接返回
  14.      if ((!temp_buf.contains("{"))&(PasteData.isNull()))
  15.      {
  16.      return;
  17.      }
  18.      //第一种:有头无尾,先清空原有内容,再附加
  19.      if ((temp_buf.contains("{"))&(!temp_buf.contains("}")))
  20.      {
  21.      PasteData.clear();
  22.      PasteData.append(temp_buf);
  23.      }
  24.      //第二种:无头无尾且变量已有内容,数据中段部分,继续附加即可
  25.      if ((!temp_buf.contains("{"))&(!temp_buf.contains("}"))&(!PasteData.isNull()))
  26.      {
  27.      PasteData.append(temp_buf);
  28.      }
  29.      //第三种:无头有尾且变量已有内容,已完整读取,附加后输出数据,并清空变量
  30.      if ((!temp_buf.contains("{"))&(temp_buf.contains("}"))&(!PasteData.isNull()))
  31.      {
  32.      PasteData.append(temp_buf);
  33.      buf = PasteData;
  34.      PasteData.clear();
  35.      }
  36.      //第四种:有头有尾(一段完整的内容),先清空原有内容,再附加,然后输出,最后清空变量
  37.      if ((temp_buf.contains("{"))&(temp_buf.contains("}")))
  38.      {
  39.         if(temp_buf.at(0)==123)
  40.          {
  41.          if(temp_buf.at(3)==0||temp_buf.at(3)==1)
  42.           {
  43.           PasteData.clear();
  44.           temp = temp_buf.left(5);
  45.           PasteData.append(temp);
  46.           buf = PasteData;
  47.           PasteData.clear();
  48.           QApplication::restoreOverrideCursor();
  49.          }
  50.         }
  51.         else return;
  52.     }
  53.       qDebug() << buf;
  54.      QApplication::setOverrideCursor(Qt::WaitCursor);
  55.                 if(buf.at(1)==0)//0X00表示停机
  56.                 {
  57.                 pal.setColor(QPalette::Background, Qt::yellow); //设置背景黄色
  58.                 ui->widget_1->setAutoFillBackground(true);
  59.                 ui->widget_1->setPalette(pal);
  60.                 ui->widget_1->show();
  61.                 t.start();
  62.                 while(t.elapsed()<100);//停机
  63.                 {
  64.                     if(buf.at(1)==0)
  65.                     {
  66.                         pal.setColor(QPalette::Background, Qt::red); //设置背景红色
  67.                         ui->widget_1->setAutoFillBackground(true);
  68.                         ui->widget_1->setPalette(pal);
  69.                         ui->widget_1->show();
  70.                     }
  71.                 }
  72.             }
  73.             else if(buf.at(1)==1)
  74.             {

  75.                 pal.setColor(QPalette::Background, Qt::green); //设置背景绿色
  76.                 ui->widget_1->setAutoFillBackground(true);
  77.                 ui->widget_1->setPalette(pal);
  78.                 ui->widget_1->show();
  79.             }
  80.             else
  81.             {

  82.                 pal.setColor(QPalette::Background, Qt::gray); //设置背景灰色
  83.                 ui->widget_1->setAutoFillBackground(true);
  84.                 ui->widget_1->setPalette(pal);
  85.                 ui->widget_1->show();
  86.             }
  87.            if(buf.at(2)==0)//0X00表示停机
  88.            {

  89.                 pal2.setColor(QPalette::Background, Qt::yellow); //设置背景黄色
  90.                 ui->widget_2->setAutoFillBackground(true);
  91.                 ui->widget_2->setPalette(pal2);
  92.                 ui->widget_2->show();
  93.                 t.start();
  94.                 while(t.elapsed()<100);//停机
  95.                 {
  96.                     if(buf.at(2)==0)
  97.                     {
  98.                         pal2.setColor(QPalette::Background, Qt::red); //设置背景红色
  99.                         ui->widget_2->setAutoFillBackground(true);
  100.                         ui->widget_2->setPalette(pal2);
  101.                         ui->widget_2->show();
  102.                     }
  103.                 }
  104.             }
  105.             else if(buf.at(2)==1)
  106.             {
  107.                 pal2.setColor(QPalette::Background, Qt::green); //设置背景绿色
  108.                 ui->widget_2->setAutoFillBackground(true);
  109.                 ui->widget_2->setPalette(pal2);
  110.                 ui->widget_2->show();
  111.             }
  112.             else
  113.             {
  114.                 pal2.setColor(QPalette::Background, Qt::gray); //设置背景灰色
  115.                 ui->widget_2->setAutoFillBackground(true);
  116.                 ui->widget_2->setPalette(pal2);
  117.                 ui->widget_2->show();
  118.             }
  119.            if(buf.at(3)==0)//0X00表示停机
  120.            {
  121.                 pal3.setColor(QPalette::Background, Qt::yellow); //设置背景黄色
  122.                 ui->widget_3->setAutoFillBackground(true);
  123.                 ui->widget_3->setPalette(pal3);
  124.                 ui->widget_3->show();
  125.                 t.start();
  126.                 while(t.elapsed()<100);//停机
  127.                 {
  128.                     if(buf.at(3)==0)
  129.                     {
  130.                         pal3.setColor(QPalette::Background, Qt::red); //设置背景红色
  131.                         ui->widget_3->setAutoFillBackground(true);
  132.                         ui->widget_3->setPalette(pal);
  133.                         ui->widget_3->show();
  134.                     }
  135.                 }
  136.             }
  137.             else if(buf.at(3)==1)
  138.             {
  139.                 pal3.setColor(QPalette::Background, Qt::green); //设置背景绿色
  140.                 ui->widget_3->setAutoFillBackground(true);
  141.                 ui->widget_3->setPalette(pal3);
  142.                 ui->widget_3->show();
  143.             }
  144.             else
  145.             {
  146.                 pal3.setColor(QPalette::Background, Qt::gray); //设置背景灰色
  147.                 ui->widget_3->setAutoFillBackground(true);
  148.                 ui->widget_3->setPalette(pal3);
  149.                 ui->widget_3->show();
  150.             }
  151.            QApplication::restoreOverrideCursor();
  152.            buf.clear();
  153. }
复制代码
回复

使用道具 举报

累计签到:620 天
连续签到:1 天
2018-11-28 08:44:37 显示全部楼层
看看是不是有还没进行定义的变量或者对象
回复

使用道具 举报

累计签到:882 天
连续签到:3 天
2018-11-29 09:13:46 显示全部楼层
你的if 条件(&)是粘错了 还是 写错了
回复

使用道具 举报

尚未签到

2018-11-29 15:57:34 显示全部楼层
一叶知秋 发表于 2018-11-29 09:13
你的if 条件(&)是粘错了 还是 写错了

没粘错吧……&不就是与的意思吗,不知道您是不是说的是我写的使数据接收完整的语句

点评

我怎么看你是要逻辑与(&&)而不是位与的意思呢? 比如 if ((!temp_buf.contains("{"))&(PasteData.isNull()))  详情 回复 发表于 2018-11-30 09:24
回复

使用道具 举报

尚未签到

2018-11-29 20:59:29 显示全部楼层
应该不停的收到{\x00\x05\x00}
回复

使用道具 举报

累计签到:882 天
连续签到:3 天
2018-11-30 09:24:13 显示全部楼层
非白不是黑 发表于 2018-11-29 15:57
没粘错吧……&不就是与的意思吗,不知道您是不是说的是我写的使数据接收完整的语句 ...

我怎么看你是要逻辑与(&&)而不是位与的意思呢? 比如 if ((!temp_buf.contains("{"))&(PasteData.isNull()))
回复

使用道具 举报

尚未签到

2018-12-3 20:53:31 显示全部楼层
一叶知秋 发表于 2018-11-30 09:24
我怎么看你是要逻辑与(&&)而不是位与的意思呢? 比如 if ((!temp_buf.contains("{"))&(PasteData.isNul ...

我在结尾加入了延时函数,能正确接收数据了,但是每隔30组数据左右就会收到一个"QLabe"字符,请问这是为什么呢
回复

使用道具 举报

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

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了