之前使用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();
}
|