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

对串口接收到的数据进行处理,取QByteArray类数据时程序崩溃

5
回复
10903
查看
[复制链接]

尚未签到

来源: 2018-11-11 20:24:32 显示全部楼层 |阅读模式
5Qter豆
//读取接收到的数据void MyMainWindow::Read_Data(){    QByteArray buf;    QByteArray kjs;    kjs.resize(5);    QPalette pal(ui->widget_1->palette());    QPalette pal2(ui->widget_2->palette());    QPalette pal3(ui->widget_3->palette());    buf = serial->readAll();    QElapsedTimer t;    QDataStream out(&buf,QIODevice::ReadWrite);    //将字节数组读入     while(!out.atEnd())    {
        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);        if(buf.contains("#"))        {        kjs = buf.left(buf.indexOf('#')-1);           if(kjs.at(0)==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()<10000);//停机30秒                {                    if(kjs.at(0)==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(0)==1)            {               qDebug() << tr("界面颜色设定成功!");                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(1)==0)//0X00表示停机           {                pal.setColor(QPalette::Background, Qt::yellow); //设置背景黄色                ui->widget_2->setAutoFillBackground(true);                ui->widget_2->setPalette(pal);                ui->widget_2->show();                t.start();                while(t.elapsed()<10000);//停机30秒                {                    if(kjs.at(1)==0)                    {                        pal.setColor(QPalette::Background, Qt::red); //设置背景红色                        ui->widget_2->setAutoFillBackground(true);                        ui->widget_2->setPalette(pal);                        ui->widget_2->show();                    }                }            }            else if(kjs.at(1)==1)            {               qDebug() << tr("界面颜色设定成功!");                pal.setColor(QPalette::Background, Qt::green); //设置背景绿色                ui->widget_2->setAutoFillBackground(true);                ui->widget_2->setPalette(pal);                ui->widget_2->show();            }            else            {                pal.setColor(QPalette::Background, Qt::gray); //设置背景灰色                ui->widget_2->setAutoFillBackground(true);                ui->widget_2->setPalette(pal);                ui->widget_2->show();            }           if(kjs.at(2)==0)//0X00表示停机           {                pal.setColor(QPalette::Background, Qt::yellow); //设置背景黄色                ui->widget_3->setAutoFillBackground(true);                ui->widget_3->setPalette(pal);                ui->widget_3->show();                t.start();                while(t.elapsed()<10000);//停机30秒                {                    if(kjs.at(2)==0)                    {                        pal.setColor(QPalette::Background, Qt::red); //设置背景红色                        ui->widget_3->setAutoFillBackground(true);                        ui->widget_3->setPalette(pal);                        ui->widget_3->show();                    }                }            }            else if(kjs.at(2)==1)            {               qDebug() << tr("界面颜色设定成功!");                pal.setColor(QPalette::Background, Qt::green); //设置背景绿色                ui->widget_3->setAutoFillBackground(true);                ui->widget_3->setPalette(pal);                ui->widget_3->show();            }            else            {                pal.setColor(QPalette::Background, Qt::gray); //设置背景灰色                ui->widget_3->setAutoFillBackground(true);                ui->widget_3->setPalette(pal);                ui->widget_3->show();            }         }         buf.clear();    }}




弹出这个信息ASSERT: "uint(i) < uint(size())" in file ..\..\..\QT\5.6\mingw49_32\include/QtCore/qbytearray.h, line 470D:\GUI\lianxi\11 4\debug\maker.exe exited with code 3

最佳答案

查看完整内容

这个是你的程序接收是在主界面吧,接收的放在次线程,通过信号和槽来完成通信,然后更新 Ui,这样的话,应该还阔以~
回复

使用道具 举报

累计签到:742 天
连续签到:1 天
2018-11-11 20:24:33 显示全部楼层
这个是你的程序接收是在主界面吧,接收的放在次线程,通过信号和槽来完成通信,然后更新 Ui,这样的话,应该还阔以~
回复

使用道具 举报

尚未签到

2018-11-11 20:29:03 显示全部楼层
//读取接收到的数据
void MyMainWindow::Read_Data()
{
    QByteArray buf;
    QByteArray kjs;
    kjs.resize(5);
    QPalette pal(ui->widget_1->palette());
    QPalette pal2(ui->widget_2->palette());
    QPalette pal3(ui->widget_3->palette());
    buf = serial->readAll();
    QElapsedTimer t;
    QDataStream out(&buf,QIODevice::ReadWrite);    //将字节数组读入
     while(!out.atEnd())
    {

        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);
        if(buf.contains("#"))
        {
        kjs = buf.left(buf.indexOf('#')-1);
           if(kjs.at(0)==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()<10000);//停机30秒
                {
                    if(kjs.at(0)==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(0)==1)
            {
               qDebug() << tr("界面颜色设定成功!");
                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(1)==0)//0X00表示停机
           {
                pal.setColor(QPalette::Background, Qt::yellow); //设置背景黄色
                ui->widget_2->setAutoFillBackground(true);
                ui->widget_2->setPalette(pal);
                ui->widget_2->show();
                t.start();
                while(t.elapsed()<10000);//停机30秒
                {
                    if(kjs.at(1)==0)
                    {
                        pal.setColor(QPalette::Background, Qt::red); //设置背景红色
                        ui->widget_2->setAutoFillBackground(true);
                        ui->widget_2->setPalette(pal);
                        ui->widget_2->show();
                    }
                }
            }
            else if(kjs.at(1)==1)
            {
               qDebug() << tr("界面颜色设定成功!");
                pal.setColor(QPalette::Background, Qt::green); //设置背景绿色
                ui->widget_2->setAutoFillBackground(true);
                ui->widget_2->setPalette(pal);
                ui->widget_2->show();
            }
            else
            {
                pal.setColor(QPalette::Background, Qt::gray); //设置背景灰色
                ui->widget_2->setAutoFillBackground(true);
                ui->widget_2->setPalette(pal);
                ui->widget_2->show();
            }
           if(kjs.at(2)==0)//0X00表示停机
           {
                pal.setColor(QPalette::Background, Qt::yellow); //设置背景黄色
                ui->widget_3->setAutoFillBackground(true);
                ui->widget_3->setPalette(pal);
                ui->widget_3->show();
                t.start();
                while(t.elapsed()<10000);//停机30秒
                {
                    if(kjs.at(2)==0)
                    {
                        pal.setColor(QPalette::Background, Qt::red); //设置背景红色
                        ui->widget_3->setAutoFillBackground(true);
                        ui->widget_3->setPalette(pal);
                        ui->widget_3->show();
                    }
                }
            }
            else if(kjs.at(2)==1)
            {
               qDebug() << tr("界面颜色设定成功!");
                pal.setColor(QPalette::Background, Qt::green); //设置背景绿色
                ui->widget_3->setAutoFillBackground(true);
                ui->widget_3->setPalette(pal);
                ui->widget_3->show();
            }
            else
            {
                pal.setColor(QPalette::Background, Qt::gray); //设置背景灰色
                ui->widget_3->setAutoFillBackground(true);
                ui->widget_3->setPalette(pal);
                ui->widget_3->show();
            }
         }
         buf.clear();
    }
}[/code]
回复

使用道具 举报

尚未签到

2018-11-11 21:19:59 显示全部楼层
单步执行,执行到buf.clear();时程序崩溃
回复

使用道具 举报

尚未签到

2018-11-11 21:25:31 显示全部楼层
发现错误了,clear()放错位置了,但是现在又出现个问题,就是数据刷新过快,程序反应不过来

点评

建议改为异步刷新。就是一个线程读取数据并压栈。另一个定时线程刷新界面。  详情 回复 发表于 2018-11-12 09:43
回复

使用道具 举报

累计签到:41 天
连续签到:1 天
2018-11-12 09:43:14 显示全部楼层
非白不是黑 发表于 2018-11-11 21:25
发现错误了,clear()放错位置了,但是现在又出现个问题,就是数据刷新过快,程序反应不过来 ...

建议改为异步刷新。就是一个线程读取数据并压栈。另一个定时器刷新界面。
回复

使用道具 举报

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

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