Qt系列——实时接收数据,动态绘图(二)

  • 串口配置
  • 串口接收数据
  • 引入第三方库QCustomPlot
  • 动态绘图

串口接收数据

串口接收数据用到QSerialPort::readyRead,每当有新数据可从设备的当前读取通道读取时,该信号就会发出一次。只有当新数据可用时,才会再次发出。

connect(mySerialPort,&QSerialPort::readyRead,this,&Widget::dealreadyRead);

信号:readyRead;槽函数:void Widget::dealreadyRead()。其中,槽函数中即为我们对接收信号的处理解析代码,利用readAll进行读取操作。

widget.h

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    void dealreadyRead();
    double recivedata;
    QDateTime current_date_time;
    QString current_date;

private:
    Ui::Widget *ui;
    QByteArray temp;

widget.c

void Widget::dealreadyRead()
{
    if(true == mIsOpen)
    {
        current_date_time = QDateTime::currentDateTime();    //获取当前系统时间
        double t = (double)(QDateTime::currentMSecsSinceEpoch()) / 1000.0;//动态绘图用到
        current_date = current_date_time.toString("yyyy.MM.dd hh:mm:ss.zzz");//时间格式
        temp = mySerialPort->readAll();    //读取串口数据
        if(ui->sixteen->isChecked() == false)    //sixteen 判断是否勾选十六进制的复选框
        {
            ui->textEdit->append(current_date.append(temp));
        }
        else    //十六进制显示
        {
            QDataStream out(&temp,QIODevice::ReadWrite);
            while(!out.atEnd())
            {
                qint8 outChar = 0;
                out>>outChar;
                QString str = QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0'));//十六进制
                ui->textEdit->insertPlainText(str.toUpper());
                ui->textEdit->insertPlainText(" ");
                ui->textEdit->moveCursor(QTextCursor::End);
            }
        }
        QString data = QString(temp);
        QString strs;
        for(int j = 0; j < data.length(); j++)
        {
            if(data[j] >= '0' && data[j] <= '9')
            strs.append(data[j]);
        }
        recivedata = strs.toDouble();
        //draw(t,recivedata);   //绘制曲线函数
    }
}

 接收数据保存至指定路径下的代码设置void Widget::on_save_data_clicked()

widget.h

private slots:
    void on_save_data_clicked();  //按键转到槽

widget.c

void Widget::on_save_data_clicked()
{
    QString textFile = QFileDialog::getSaveFileName(this,tr("Save txt"),".数据.txt",tr("text (*.txt)")); //选择路径
    QFile file(textFile);//文件命名
    if(!file.open(QFile::WriteOnly | QFile::Text))     //检测文件是否打开
    {
        QMessageBox::information(this, "Error Message", "Please Select a Text File!");
        return;
    }
    QTextStream out(&file);                 //分行写入文件
    out << ui->textEdit->toPlainText();
}

 本节主要针对串口接收数据处理和数据保存的代码分析,下图是工程界面的布局图以及每个控件对应的对象名称,仅供参考学习。感谢分享和关注,可以留言一起交流。

 

  • 6
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆腐渣工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值