写了一个QT串口UI用于接收下位机采集的数据,使用过程,关闭串口再打开存在数据接收异常的问题,且UI会无响应。
希望能提供解决方式,请给我留言,3Q!
第一次打开串口用于接收数据正常。
关闭串口后再次打开会产生数据接收不连续以及UI界面无响应的现象。
第一部分为数据处理
void POCTdraw::AnalyzeData()
{
QByteArray mytemp = myserial->readAll();
// QByteArray mylight = QByteArray::fromHex("mytemp");
//缓存数据输出检测
// qDebug()<<"mytemp:"<<mytemp.toHex().mid(5,8);
//将缓存数据转换格式
//转为十六进制
bool ok;
QString light = mytemp.toHex().mid(5,8);
// QString mylight;
ulong mylight_1 = light.toULongLong(&ok,16);
//转为10进制后进行检测
// qDebug()<<"mylight"<<mylight_1;
mylight = 0.001*0.0625*mylight_1;
// QVector::iterator iter;
// for(iter = LightArr.begin();iter!=LightArr.end();iter++)
// {
// qDebug()<<*iter;
// }
qDebug()<<"mylight"<<mylight;
// QString textlight;
textlight = QString::number(mylight,'f',5);
LightArr.append(textlight);
//将串口发送过来的数据在(实时荧光强度)进行显示
// ui->lineEdit->setText(mytemp);
// float dataI1 = mytemp.toFloat(); //将字符串转换成float类型进行数据处理
ui->lineEdit->setText(textlight);
float dataI1 = textlight.toFloat(); //将字符串转换成float类型进行数据处理
//获取系统时间
mycurrenttime = QDateTime::currentDateTime();
double xzb = mystarttime.msecsTo(mycurrenttime)/1000.0; //获取横坐标,相对时间从0开始
//将转换好的数据发给坐标系显示
// ui->POCTdraw_plot->graph(0)->addData(xzb,dataI1);//添加数据1到曲线1
ui->widget_4->graph(0)->addData(xzb,dataI1);
//设定横坐标显示范围
if(xzb>50)
{
ui->widget_4->xAxis->setRange((double)qRound(xzb-50),xzb);
}
else ui->widget_4->xAxis->setRange(0,50); //设定x轴范围
ui->widget_4->replot(); //每次画完曲线更新显示
}
第二部分为打开按钮的相关内容
void POCTdraw::on_b_start_clicked()
{
if(serial_flag)
{
ui->comboBox_2->setDisabled(true);//禁止修改串口
//设置串口号
myserial->setPortName(ui->comboBox_2->currentText());
//设置波特率
//serial->setBaudRate(ui->BaudBox->currentText().toInt());
//myserial->setBaudRate(QSerialPort::Baud115200);
myserial->setBaudRate(ui->comboBox->currentText().toInt());
//设置数据位数
myserial->setDataBits(QSerialPort::Data8);
//设置奇偶校验
myserial->setParity(QSerialPort::NoParity);
//设置停止位
myserial->setStopBits(QSerialPort::OneStop);
//非流控制
myserial->setFlowControl(QSerialPort::NoFlowControl);
if(myserial->open(QIODevice::ReadWrite)) //输入和输出的基类
{
connect(myserial,&QSerialPort::readyRead,this,&POCTdraw::AnalyzeData);
mystarttime = QDateTime::currentDateTime(); //图像横坐标初始值参考点,读取初始时间
qDebug()<<"串口打开成功";
}
else
{
qDebug()<<"串口打开失败";
//QMessageBox::warning(this,tr("waring"),tr("串口打开失败"),QMessageBox::close);
}
ui->b_start->setText("关闭串口");
//串口标志位置失效
serial_flag = false;
}
else
{
ui->comboBox->setEnabled(true);
ui->comboBox_2->setEnabled(true);
myserial->close();
ui->b_start->setText("打开串口");
serial_flag = true;//串口标志位置工作;
}
}