用QT将串口读取到的温度数据进行绘图,绘图长度为最近的20个点,给出具体代码
时间: 2024-02-19 10:02:43 浏览: 75
Qt串口收发数据,CustomPlot实时绘图.rar
5星 · 资源好评率100%
以下是一个简单的例子,演示如何使用Qt绘制串口读取到的温度数据折线图,绘图长度为最近的20个点:
```cpp
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
#include <QtCharts/QValueAxis>
#include <QHBoxLayout>
#include <QWidget>
QT_CHARTS_USE_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void readData();
private:
QSerialPort *serialPort;
QLineSeries *series;
QChart *chart;
};
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
// 创建串口对象
serialPort = new QSerialPort(this);
serialPort->setPortName("COM3"); // 设置串口号
serialPort->setBaudRate(QSerialPort::Baud9600); // 设置波特率
// 创建折线图对象
series = new QLineSeries(this);
chart = new QChart();
chart->addSeries(series);
chart->setTitle("Temperature Data");
chart->createDefaultAxes();
// 设置X轴范围
QValueAxis *axisX = new QValueAxis();
axisX->setRange(0, 20);
axisX->setLabelFormat("%d");
chart->setAxisX(axisX, series);
// 设置Y轴范围
QValueAxis *axisY = new QValueAxis();
axisY->setRange(0, 100);
axisY->setLabelFormat("%.1f");
chart->setAxisY(axisY, series);
// 创建图表视图对象
QChartView *chartView = new QChartView(this);
chartView->setChart(chart);
chartView->setRenderHint(QPainter::Antialiasing);
// 创建水平布局,并添加图表视图对象
QHBoxLayout *layout = new QHBoxLayout();
layout->addWidget(chartView);
setLayout(layout);
// 打开串口,并连接读取数据的信号
serialPort->open(QIODevice::ReadOnly);
connect(serialPort, SIGNAL(readyRead()), this, SLOT(readData()));
}
Widget::~Widget()
{
// 关闭串口
serialPort->close();
}
void Widget::readData()
{
static int count = 0;
static QVector<QPointF> points;
// 读取数据并转换为温度值
QByteArray data = serialPort->readAll();
qreal temperature = data.toDouble();
// 添加新的数据点
points.append(QPointF(count, temperature));
count++;
// 绘制最近的20个数据点
if (points.size() > 20) {
points.remove(0);
}
// 更新折线图
series->replace(points);
chart->axisX(series)->setRange(count - 20, count);
}
```
在这个例子中,我们创建了一个QWidget对象,并使用QHBoxLayout布局将QChartView对象添加到QWidget对象中。我们使用QSerialPort对象读取串口数据,并将其转换为温度值。然后,我们使用QLineSeries对象保存最近的20个数据点,并使用QChart对象和QValueAxis对象绘制折线图。最后,我们使用readyRead()信号和readData()槽函数更新折线图。
阅读全文