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

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 关于#Mybatis#的问题:怎么办重复数据如下"KSDM":37,"KSMC":"呼吸内科门诊","ksdm":37,"ksmc":"呼吸内科门诊"xml文件填写
  • ¥40 servlet的web程序部署出错
  • ¥50 activiti 新建流程系列问题
  • ¥50 为什么我版本升级之后运行速度变慢5倍??
  • ¥15 如何在gazebo中加载机械臂和机械手
  • ¥15 纯运放实现隔离采样方案设计
  • ¥20 easyconnect无法连接后缀带.com的网站,一直显示找不到服务器ip地址,但是带有数字的网站又是可以连接上的,如何解决
  • ¥15 电脑开机过商标后就直接这样,求解各位
  • ¥15 mysql , 用自己创建的本地主机和用户名 登录不上
  • ¥15 关于#web项目#的问题,请各位专家解答!