QT读取串口数据并显示

效果图:
在这里插入图片描述
ui界面:
在这里插入图片描述
代码区.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSerialPort>           //提供访问串口的功能
#include <QSerialPortInfo>    //提供系统中存在的串口的信息
#include<QtCharts>
QT_CHARTS_USE_NAMESPACE
namespace Ui {
    
    
class MainWindow;
}

class MainWindow : public QMainWindow
{
    
    
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    void createXY();
    ~MainWindow();
protected:
    void readyReadData();


private slots:
      void updata_plot();

    void on_pushButton_clicked();

    void on_pushButtonoff_clicked();

private:
     QTimer *timer_plot;
     //曲线
         QSplineSeries* line;
         //曲线点的最大数量
         int line_max = 100;

         //绘图变量和坐标
         QChart* chart;
         //QValueAxis *axisX;
         //QValueAxis *axisY;
         QVector<QPointF> list;//保存心跳点
         double tim=0;//时间

         //int t=0;


    //创建串口对象
    QSerialPort serial;
    int heartnum=10;
    QByteArray array;
    int timeid;
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QTimer>
//#include <QSerialPort>        //提供访问串口的功能
//#include <QSerialPortInfo>    //提供系统中存在的串口的信息
#include<QPen>
#include<QPainter>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    
    
    ui->setupUi(this);
    timer_plot = new QTimer(this);
    connect(timer_plot,SIGNAL(timeout()),this,SLOT(updata_plot()));
    line = new QSplineSeries(this);
    chart = new QChart();
    chart->addSeries(line);
    //QPointF p1(0,180);

    //list.push_back(p1);
    //通过QSerialPortInfo查找可用串口
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
    
    
        qWarning() << info.portName();
    }

    //设置串口名COM1
    serial.setPortName("COM5");
    //设置波特率
    serial.setBaudRate(QSerialPort::Baud9600);
    //设置数据位数8位
    serial.setDataBits(QSerialPort::Data8);
    //设置无奇偶校验
    serial.setParity(QSerialPort::NoParity);
    //设置停止位1位
    serial.setStopBits(QSerialPort::OneStop);
    //设置没有流控制
    serial.setFlowControl(QSerialPort::NoFlowControl);
    //读写方式打开串口
    serial.open(QIODevice::ReadWrite);
    // 连接信号和槽
    //connect(&serial,&QSerialPort::readyRead,this,&MainWindow::readyReadData);
    connect(&serial,&QSerialPort::readyRead,
            [=]()
    {
    
    
        QByteArray buffer = serial.readAll();
       char *m=buffer.data();
      QString str=m;
      heartnum=str.mid(4,6).toInt();
       ui->textEdit->setText(m);
      //t=t+5;
      QPointF p(tim,heartnum);
      list.push_back(p);
    }
    );
    //serial.close();
}
void MainWindow::updata_plot()
{
    
    
       line->replace(list);//替换更新
       line->setName("heart");//设置曲线名称
       line->setPen(QColor(255, 0, 0));//设置曲线颜色
       line->setUseOpenGL(true);//openGl 加速
       chart->setTitle("呼吸曲线");//设置图标标题
       chart->removeSeries(line);
       chart->addSeries(line);
       chart->createDefaultAxes();//设置坐标轴
        //chart->axisX()->setRange(0,180);
       chart->axisY()->setRange(0,180);

       ui->widget->setChart(chart);
       tim+=0.05;
}

MainWindow::~MainWindow()
{
    
    
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    
    
    timer_plot->start(50);//启动定时器
}

void MainWindow::on_pushButtonoff_clicked()
{
    
    
   timer_plot->stop();//关闭定时器
}

猜你喜欢

转载自blog.csdn.net/weixin_47414687/article/details/115367562