在树莓派4b中用QT5写一个获取串口数据并显示到图表中的工程并给出.pro .h .cpp文件并给出相应的注释
时间: 2024-02-12 11:02:41 浏览: 74
好的,我可以为您提供一个简单的示例工程,该工程可以实现获取串口数据并将其显示到图表中。由于涉及到图表显示,我们需要使用QT5中的QtCharts模块。下面是工程文件及相应的注释:
1. .pro文件
```
#-------------------------------------------------
#
# Project created by QtCreator 2021-07-15T16:40:22
#
#-------------------------------------------------
QT += core gui serialport charts
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = SerialChart
TEMPLATE = app
SOURCES += main.cpp \
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
#-------------------------------------------------
```
2. main.cpp文件
```
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
```
3. mainwindow.h文件
```
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtCharts>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
QT_CHARTS_USE_NAMESPACE
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void readData();
void updateChart();
private:
Ui::MainWindow *ui;
QSerialPort *serial;
QLineSeries *series;
QChart *chart;
QTimer *timer;
};
#endif // MAINWINDOW_H
```
4. mainwindow.cpp文件
```
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建串口对象
serial = new QSerialPort(this);
// 设置串口参数
serial->setPortName("COM3"); // 根据实际情况设置串口名称
serial->setBaudRate(QSerialPort::Baud9600);
serial->setDataBits(QSerialPort::Data8);
serial->setParity(QSerialPort::NoParity);
serial->setStopBits(QSerialPort::OneStop);
// 打开串口
if (!serial->open(QIODevice::ReadOnly))
{
qDebug() << "Failed to open serial port.";
return;
}
// 创建图表
series = new QLineSeries();
chart = new QChart();
chart->addSeries(series);
chart->setTitle("Serial Data");
chart->createDefaultAxes();
chart->axisX()->setTitleText("Time");
chart->axisY()->setTitleText("Value");
// 创建图表视图
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
// 将图表视图添加到主窗口
ui->chartLayout->addWidget(chartView);
// 创建定时器
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateChart()));
timer->start(1000); // 每1秒更新一次
// 连接串口数据接收信号
connect(serial, SIGNAL(readyRead()), this, SLOT(readData()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::readData()
{
QByteArray data = serial->readAll();
QString str = QString(data);
// 将串口数据转换为浮点数
bool ok;
float value = str.toFloat(&ok);
if (ok)
{
// 将数据添加到图表中
series->append(QDateTime::currentMSecsSinceEpoch(), value);
}
}
void MainWindow::updateChart()
{
// 保持图表中的数据点数量不超过50个
while (series->count() > 50)
{
series->remove(0);
}
// 设置图表的X轴范围
qint64 now = QDateTime::currentMSecsSinceEpoch();
qint64 min = now - 5000; // 5秒钟内的数据
chart->axisX()->setRange(min, now);
}
```
注释中已经详细说明了每个文件中的代码实现。需要注意的是,该示例工程中的串口名称需要根据实际情况进行修改,否则无法正常运行。
阅读全文