xieluk 2021-07-15 18:46 采纳率: 100%
浏览 473
已结题

QT串口UI,再次打开串口会存在数据接收不连续/UI无响应等问题。

写了一个QT串口UI用于接收下位机采集的数据,使用过程,关闭串口再打开存在数据接收异常的问题,且UI会无响应。
希望能提供解决方式,请给我留言,3Q!

第一次打开串口用于接收数据正常。

img

关闭串口后再次打开会产生数据接收不连续以及UI界面无响应的现象。

img

第一部分为数据处理
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;//串口标志位置工作;
}

}

  • 写回答

2条回答 默认 最新

  • zeal_for_rov 2021-12-15 11:46
    关注

    如下建议:
    1.尝试在关闭的else里面 添加 disconnect(myserial,&QSerialPort::readyRead,this,&POCTdraw::AnalyzeData);
    2.打开后清空串口发送接收缓存区

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月23日
  • 已采纳回答 12月15日
  • 创建了问题 7月15日

悬赏问题

  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏