Qt 5.11上位机设计:接收STM32信号、绘制波形和界面设计
使用Qt 5.11设计上位机,接收STM32信号并绘制波形
本教程将指导您使用Qt 5.11设计一个上位机程序,实现以下功能:
-
接收来自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(); } ``` -
将信号输出为波形。
要将信号输出为波形,可以使用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(); } ``` -
设计出对应的上位机界面。
要设计上位机界面,可以使用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设计上位机的简单示例,其中包括接收不同信号、绘制波形和设计界面的功能。根据实际需求,可以进一步完善和扩展这些功能。
原文地址: https://www.cveoy.top/t/topic/o8e6 著作权归作者所有。请勿转载和采集!