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

为QByteArray数组设置容量后,出现乱码

4
回复
9555
查看
[复制链接]

尚未签到

来源: 2018-11-29 21:08:49 显示全部楼层 |阅读模式
1Qter豆
之前使用QByteArray数组接收串口发来的程序,运行程序出现ASSERT: "uint(i) < uint(size())" 的错误,在开头为QByteArray数组设置容量后问题解决,但是却接收到一堆乱码。\xAA\x00\x00\x00""QLab"
"QWid"
"2\x00""8\x00"
"QWid"
"QLab"
请给位大大救命呀~~


//读取接收到的数据
void MyMainWindow::Read_Data()
{
        QByteArray buf;
        buf.resize(4);
        QByteArray temp_buf;
        QByteArray temp;
        QByteArray PasteData;
        int a=0,b=0,c=0;
        QPalette pal(ui->widget_1->palette());
        QPalette pal2(ui->widget_2->palette());
        QPalette pal3(ui->widget_3->palette());
        QApplication::setOverrideCursor(Qt::WaitCursor);
         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("}")))
         {
              PasteData.clear();
              temp = temp_buf.left(5);
              if(temp.at(0)==123)
               {
               if(temp.at(3)==0||temp.at(3)==1)
                {
                // PasteData.append(temp);
                // buf = PasteData;
                   buf = temp;
                 PasteData.clear();
                 temp_buf.clear();
                 temp.clear();
                 }
               }
        }
        qDebug() << buf;
                       if(buf.at(1)==0)//0X00表示停机
                       {
                       pal.setColor(QPalette::Background, Qt::yellow); //设置背景黄色
                       ui->widget_1->setAutoFillBackground(true);
                       ui->widget_1->setPalette(pal);
                       ui->widget_1->show();
                       a++;

                           if(a>=2)
                           {
                               pal.setColor(QPalette::Background, Qt::red); //设置背景红色
                               ui->widget_1->setAutoFillBackground(true);
                               ui->widget_1->setPalette(pal);
                               ui->widget_1->show();
                               a=0;
                           }
                       }

                   else if(buf.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(buf.at(2)==0)//0X00表示停机
                  {

                       pal2.setColor(QPalette::Background, Qt::yellow); //设置背景黄色
                       ui->widget_2->setAutoFillBackground(true);
                       ui->widget_2->setPalette(pal2);
                       ui->widget_2->show();
                       b++;
                           if(b>=2)
                           {
                               pal2.setColor(QPalette::Background, Qt::red); //设置背景红色
                               ui->widget_2->setAutoFillBackground(true);
                               ui->widget_2->setPalette(pal2);
                               ui->widget_2->show();
                                   b=0;
                           }
                   }
                   else if(buf.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(buf.at(3)==0)//0X00表示停机
                  {
                       pal3.setColor(QPalette::Background, Qt::yellow); //设置背景黄色
                       ui->widget_3->setAutoFillBackground(true);
                       ui->widget_3->setPalette(pal3);
                       ui->widget_3->show();
                       c++;
                           if(c>=2)
                           {
                               pal3.setColor(QPalette::Background, Qt::red); //设置背景红色
                               ui->widget_3->setAutoFillBackground(true);
                               ui->widget_3->setPalette(pal);
                               ui->widget_3->show();
                               c=0;
                           }

                   }
                   else if(buf.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();
                   }
        QApplication::restoreOverrideCursor();
        buf.clear();
}

最佳答案

查看完整内容

你这我建议从数据发送端和接收端查,数据不会凭空产生,你收到了“QLabe”这样的字符,看看是你发送的数据就有还是收到数据后什么操作污染了数据。
回复

使用道具 举报

累计签到:955 天
连续签到:1 天
2018-11-29 21:08:50 显示全部楼层
非白不是黑 发表于 2018-12-3 20:54
我在结尾加入了延时函数,能正确接收数据了,但是每隔30组数据左右就会收到一个"QLabe"字符,请问这是为 ...

你这我建议从数据发送端和接收端查,数据不会凭空产生,你收到了“QLabe”这样的字符,看看是你发送的数据就有还是收到数据后什么操作污染了数据。
回复

使用道具 举报

累计签到:955 天
连续签到:1 天
2018-11-30 16:52:41 显示全部楼层
你说的乱码是你接收到的数据是乱码还是显示出来是乱码?
回复

使用道具 举报

尚未签到

2018-11-30 20:17:37 来自手机 显示全部楼层
wdmxtk002 发表于 2018-11-30 16:52
你说的乱码是你接收到的数据是乱码还是显示出来是乱码?

我用Qdebug显示的内容,第一个数是对的,后面的都是乱码,但是在串口助手里显示的是对的
回复

使用道具 举报

尚未签到

2018-12-3 20:54:02 显示全部楼层
wdmxtk002 发表于 2018-11-30 16:52
你说的乱码是你接收到的数据是乱码还是显示出来是乱码?

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

点评

你这我建议从数据发送端和接收端查,数据不会凭空产生,你收到了“QLabe”这样的字符,看看是你发送的数据就有还是收到数据后什么操作污染了数据。  详情 回复 发表于 2018-12-4 09:27
回复

使用道具 举报

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

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