使用Qt 5.11设计上位机,接收STM32信号并绘制波形

本教程将指导您使用Qt 5.11设计一个上位机程序,实现以下功能:

  1. 接收来自STM32开发板的三种不同信号,可以通过前缀和后缀的关键字来区分信号的方法。

    首先,在STM32开发板上,通过串口发送不同的信号,并在信号前后添加关键字作为标识符。例如,发送的三种信号分别为'SignalA'、'SignalB'和'SignalC'。在上位机程序中,使用Qt的串口通信模块来接收信号,并通过关键字来区分不同的信号。

    以下是一个简单的示例代码:

    
    #include <QCoreApplication>    #include <QtSerialPort/QSerialPort>    #include <QtSerialPort/QSerialPortInfo>    #include <QDebug>
    
    int main(int argc, char *argv[])    {        QCoreApplication a(argc, argv);
    
        QSerialPort serialPort;        serialPort.setPortName("COM1"); // 设置串口号        serialPort.setBaudRate(QSerialPort::Baud9600); // 设置波特率
    
        if (!serialPort.open(QIODevice::ReadOnly)) {            qWarning() << "Failed to open serial port";            return -1;        }
    
        while (true) {            if (serialPort.waitForReadyRead(1000)) {                QByteArray data = serialPort.readAll();                QString signal = QString::fromUtf8(data);
    
                if (signal.startsWith("SignalA")) {                    qDebug() << "Received SignalA";                    // 处理SignalA的逻辑                } else if (signal.startsWith("SignalB")) {                    qDebug() << "Received SignalB";                    // 处理SignalB的逻辑                } else if (signal.startsWith("SignalC")) {                    qDebug() << "Received SignalC";                    // 处理SignalC的逻辑                }            }        }
    
        return a.exec();    }    ```
    
    
  2. 将信号输出为波形。

    要将信号输出为波形,可以使用Qt的绘图模块来实现。在上位机程序中,使用Qt的绘图类(如QPainter)来绘制波形图。

    以下是一个简单的示例代码:

    
    #include <QCoreApplication>    #include <QtSerialPort/QSerialPort>    #include <QtSerialPort/QSerialPortInfo>    #include <QtWidgets/QApplication>    #include <QtWidgets/QWidget>    #include <QtGui/QPainter>    #include <QtCore/QTimer>    #include <QDebug>
    
    class WaveformWidget : public QWidget    {    public:        WaveformWidget(QWidget *parent = nullptr) : QWidget(parent) {}
    
        void addDataPoint(double value)        {            dataPoints.append(value);            if (dataPoints.size() > width()) {                dataPoints.removeFirst();            }            update();        }
    
    protected:        void paintEvent(QPaintEvent *event) override        {            QPainter painter(this);            painter.setRenderHint(QPainter::Antialiasing);
    
            painter.fillRect(rect(), Qt::white);
    
            painter.setPen(Qt::black);            painter.drawLine(rect().topLeft(), rect().bottomLeft());
    
            painter.setPen(Qt::blue);            for (int i = 0; i < dataPoints.size() - 1; i++) {                int x1 = i;                int y1 = height() - (dataPoints.at(i) * height() / 2);                int x2 = i + 1;                int y2 = height() - (dataPoints.at(i + 1) * height() / 2);                painter.drawLine(x1, y1, x2, y2);            }        }
    
    private:        QList<double> dataPoints;    };
    
    int main(int argc, char *argv[])    {        QCoreApplication a(argc, argv);
    
        QSerialPort serialPort;        serialPort.setPortName("COM1"); // 设置串口号        serialPort.setBaudRate(QSerialPort::Baud9600); // 设置波特率
    
        if (!serialPort.open(QIODevice::ReadOnly)) {            qWarning() << "Failed to open serial port";            return -1;        }
    
        QApplication application(argc, argv);        WaveformWidget waveformWidget;        waveformWidget.show();
    
        QTimer timer;        QObject::connect(&timer, &QTimer::timeout, [&]() {            if (serialPort.waitForReadyRead(1000)) {                QByteArray data = serialPort.readAll();                QString signal = QString::fromUtf8(data);
    
                if (signal.startsWith("SignalA")) {                    qDebug() << "Received SignalA";                    waveformWidget.addDataPoint(0.5);                } else if (signal.startsWith("SignalB")) {                    qDebug() << "Received SignalB";                    waveformWidget.addDataPoint(0.8);                } else if (signal.startsWith("SignalC")) {                    qDebug() << "Received SignalC";                    waveformWidget.addDataPoint(0.2);                }            }        });        timer.start(100);
    
        return application.exec();    }    ```
    
    
  3. 设计出对应的上位机界面。

    要设计上位机界面,可以使用Qt的界面设计工具(如Qt Designer)来创建界面,并使用Qt的界面类(如QWidget)来显示界面。

    以下是一个简单的示例代码:

    
    #include <QCoreApplication>    #include <QtSerialPort/QSerialPort>    #include <QtSerialPort/QSerialPortInfo>    #include <QtWidgets/QApplication>    #include <QtWidgets/QWidget>    #include <QtWidgets/QVBoxLayout>    #include <QtWidgets/QPushButton>    #include <QtGui/QPainter>    #include <QtCore/QTimer>    #include <QDebug>
    
    class MainWindow : public QWidget    {    public:        MainWindow(QWidget *parent = nullptr) : QWidget(parent)        {            QVBoxLayout *layout = new QVBoxLayout(this);
    
            QPushButton *buttonA = new QPushButton("SignalA", this);            connect(buttonA, &QPushButton::clicked, [&]() {                qDebug() << "SignalA clicked";            });            layout->addWidget(buttonA);
    
            QPushButton *buttonB = new QPushButton("SignalB", this);            connect(buttonB, &QPushButton::clicked, [&]() {                qDebug() << "SignalB clicked";            });            layout->addWidget(buttonB);
    
            QPushButton *buttonC = new QPushButton("SignalC", this);            connect(buttonC, &QPushButton::clicked, [&]() {                qDebug() << "SignalC clicked";            });            layout->addWidget(buttonC);        }    };
    
    int main(int argc, char *argv[])    {        QCoreApplication a(argc, argv);
    
        QSerialPort serialPort;        serialPort.setPortName("COM1"); // 设置串口号        serialPort.setBaudRate(QSerialPort::Baud9600); // 设置波特率
    
        if (!serialPort.open(QIODevice::ReadOnly)) {            qWarning() << "Failed to open serial port";            return -1;        }
    
        QApplication application(argc, argv);        MainWindow mainWindow;        mainWindow.show();
    
        return application.exec();    }    ```
    
    以上是一个使用Qt 5.11设计上位机的简单示例,其中包括接收不同信号、绘制波形和设计界面的功能。根据实际需求,可以进一步完善和扩展这些功能。
    
Qt 5.11上位机设计:接收STM32信号、绘制波形和界面设计

原文地址: https://www.cveoy.top/t/topic/o8e6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录