From bb2f8f310ff68d8dbef2eae3b778f5c5a2db66e3 Mon Sep 17 00:00:00 2001 From: mhvhm <1308784381@qq.com> Date: Fri, 6 Sep 2024 00:34:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=95=8C=E9=9D=A2=E7=9A=84?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E7=BB=98=E5=88=B6=EF=BC=9B=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E7=BA=BF=E7=A8=8B=E5=92=8C=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E7=9A=84=E5=B0=8F=E9=83=A8=E5=88=86=E5=88=86?= =?UTF-8?q?=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + README.md | 15 + SerialSynTool/SerialSynTool.pro | 11 +- SerialSynTool/SerialSynTool.pro.user | 526 +++++++++++------------ SerialSynTool/mainwindow.cpp | 155 +++++++ SerialSynTool/mainwindow.h | 19 + SerialSynTool/mainwindow.ui | 612 ++++++++++++++++++++++++++- SerialSynTool/serialport.cpp | 46 ++ SerialSynTool/serialport.h | 45 ++ _src/SRC.qrc | 5 + _src/img/refresh.png | Bin 0 -> 7208 bytes 11 files changed, 1150 insertions(+), 286 deletions(-) create mode 100644 .gitignore create mode 100644 SerialSynTool/serialport.cpp create mode 100644 SerialSynTool/serialport.h create mode 100644 _src/SRC.qrc create mode 100644 _src/img/refresh.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1361e68 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build-* +.vscode \ No newline at end of file diff --git a/README.md b/README.md index e69de29..420602e 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,15 @@ + + +| 更新时间 | 更新内容 | +| ---------- | ------------------------------------------------------------ | +| 2024-09-06 | 1. 完成界面的基本绘制
2. 完成部分ui线程和工作线程的分离
| +| | | +| | | + + + + + +# TODO + +- [2024-09-06] 创建了两个同类型变量,将两个变量的同一个槽函数绑定在同一个信号上,如何做到区分 \ No newline at end of file diff --git a/SerialSynTool/SerialSynTool.pro b/SerialSynTool/SerialSynTool.pro index 0086fd6..cdac8d9 100644 --- a/SerialSynTool/SerialSynTool.pro +++ b/SerialSynTool/SerialSynTool.pro @@ -1,4 +1,4 @@ -QT += core gui +QT += core gui serialport greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -17,10 +17,12 @@ DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ main.cpp \ - mainwindow.cpp + mainwindow.cpp \ + serialport.cpp HEADERS += \ - mainwindow.h + mainwindow.h \ + serialport.h FORMS += \ mainwindow.ui @@ -29,3 +31,6 @@ FORMS += \ qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +RESOURCES += \ + ../_src/SRC.qrc diff --git a/SerialSynTool/SerialSynTool.pro.user b/SerialSynTool/SerialSynTool.pro.user index 9a13d87..6f939c9 100644 --- a/SerialSynTool/SerialSynTool.pro.user +++ b/SerialSynTool/SerialSynTool.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -58,6 +58,249 @@ ProjectExplorer.Project.Target.0 + + Desktop Qt 5.14.2 MinGW 64-bit + Desktop Qt 5.14.2 MinGW 64-bit + qt.qt5.5142.win64_mingw73_kit + 0 + 0 + 0 + + E:/Project/QT_Projects/SerialSynTool/build-SerialSynTool-Desktop_Qt_5_14_2_MinGW_64_bit-Debug + + + true + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + + + E:/Project/QT_Projects/SerialSynTool/build-SerialSynTool-Desktop_Qt_5_14_2_MinGW_64_bit-Release + + + true + QtProjectManager.QMakeBuildStep + false + + false + false + true + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + + + E:/Project/QT_Projects/SerialSynTool/build-SerialSynTool-Desktop_Qt_5_14_2_MinGW_64_bit-Profile + + + true + QtProjectManager.QMakeBuildStep + true + + false + true + true + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + + 3 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + Qt4ProjectManager.Qt4RunConfiguration:E:/Project/QT_Projects/SerialSynTool/SerialSynTool/SerialSynTool.pro + E:/Project/QT_Projects/SerialSynTool/SerialSynTool/SerialSynTool.pro + + false + + false + true + true + false + false + true + + E:/Project/QT_Projects/SerialSynTool/build-SerialSynTool-Desktop_Qt_5_14_2_MinGW_64_bit-Debug + + 1 + + + + ProjectExplorer.Project.Target.1 Desktop Qt 5.14.2 MSVC2015 64bit Desktop Qt 5.14.2 MSVC2015 64bit @@ -282,14 +525,14 @@ 2 - - ProjectExplorer.CustomExecutableRunConfiguration - + Qt4ProjectManager.Qt4RunConfiguration:E:/Project/QT_Projects/SerialSynTool/SerialSynTool/SerialSynTool.pro + E:/Project/QT_Projects/SerialSynTool/SerialSynTool/SerialSynTool.pro false false true + true false false true @@ -299,38 +542,8 @@ 1 - - ProjectExplorer.Project.Target.1 - - Desktop Qt 5.14.2 MSVC2017 32bit - Desktop Qt 5.14.2 MSVC2017 32bit - qt.qt5.5142.win32_msvc2017_kit - -1 - -1 - -1 - 0 - 0 - - 0 - - ProjectExplorer.Project.Target.2 - - Desktop Qt 5.14.2 MSVC2017 64bit - Desktop Qt 5.14.2 MSVC2017 64bit - qt.qt5.5142.win64_msvc2017_64_kit - -1 - -1 - -1 - 0 - 0 - - 0 - - - - ProjectExplorer.Project.Target.3 Desktop Qt 5.14.2 MinGW 32-bit Desktop Qt 5.14.2 MinGW 32-bit @@ -572,252 +785,9 @@ 1 - - ProjectExplorer.Project.Target.4 - - Desktop Qt 5.14.2 MinGW 64-bit - Desktop Qt 5.14.2 MinGW 64-bit - qt.qt5.5142.win64_mingw73_kit - 0 - 0 - 0 - - E:/Project/QT_Projects/SerialSynTool/build-SerialSynTool-Desktop_Qt_5_14_2_MinGW_64_bit-Debug - - - true - QtProjectManager.QMakeBuildStep - true - - false - false - false - - - true - Qt4ProjectManager.MakeStep - - false - - - false - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - - true - clean - - false - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 2 - - - E:/Project/QT_Projects/SerialSynTool/build-SerialSynTool-Desktop_Qt_5_14_2_MinGW_64_bit-Release - - - true - QtProjectManager.QMakeBuildStep - false - - false - false - true - - - true - Qt4ProjectManager.MakeStep - - false - - - false - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - - true - clean - - false - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release - Qt4ProjectManager.Qt4BuildConfiguration - 0 - - - E:/Project/QT_Projects/SerialSynTool/build-SerialSynTool-Desktop_Qt_5_14_2_MinGW_64_bit-Profile - - - true - QtProjectManager.QMakeBuildStep - true - - false - true - true - - - true - Qt4ProjectManager.MakeStep - - false - - - false - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - - true - clean - - false - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Profile - Qt4ProjectManager.Qt4BuildConfiguration - 0 - - 3 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - ProjectExplorer.DefaultDeployConfiguration - - 1 - - - dwarf - - cpu-cycles - - - 250 - - -e - cpu-cycles - --call-graph - dwarf,4096 - -F - 250 - - -F - true - 4096 - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - kcachegrind - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - - ProjectExplorer.CustomExecutableRunConfiguration - - - false - - false - true - false - false - true - - - - 1 - - ProjectExplorer.Project.TargetCount - 5 + 3 ProjectExplorer.Project.Updater.FileVersion diff --git a/SerialSynTool/mainwindow.cpp b/SerialSynTool/mainwindow.cpp index 41a26bd..312ef9d 100644 --- a/SerialSynTool/mainwindow.cpp +++ b/SerialSynTool/mainwindow.cpp @@ -1,11 +1,17 @@ #include "mainwindow.h" #include "ui_mainwindow.h" + MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); + + serial = new SerialPort[SERIAL_NUM]; + + UI_Init(); // 控件初始化 + Singel_Init(); // 槽和信号的绑定 } MainWindow::~MainWindow() @@ -13,3 +19,152 @@ MainWindow::~MainWindow() delete ui; } +/* @brief: UI控件初始化 + * @para: void + * @return: void + */ +void MainWindow::UI_Init(void) +{ + // 串口端口数据刷新 + for (uint8_t i = 0; i < SERIAL_NUM; i++) + { + SerialPortInfoRefresh(i); + } + + // 表格表头 + ui->tableWidget->setColumnCount(3); // 设置3列 + ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); // 自适应列宽 +} + +/* @brief: 串口端口信息刷新 + * @para: [uint8_t] serialIdx:串口序号 + * @return: + */ +void MainWindow::SerialPortInfoRefresh(uint8_t serialIdx) +{ + QFont font; + + // 清除上一次显示 + if (serialIdx == SERIAL_1) + { + ui->comboBox_port_1->clear(); + } + else if (serialIdx == SERIAL_2) + { + ui->comboBox_port_2->clear(); + } + + foreach (const QSerialPortInfo info, QSerialPortInfo::availablePorts()) + { + switch(serialIdx) + { + case SERIAL_1: + { + if (info.isNull()) + { + font = ui->comboBox_port_1->font(); + font.setStrikeOut(true); + } + else + { + font = ui->comboBox_port_1->font(); + font.setStrikeOut(false); + } + ui->comboBox_port_1->setFont(font); + ui->comboBox_port_1->addItem(info.portName() + "-" + info.description()); + }break; + case SERIAL_2: + { + if (info.isNull()) + { + font = ui->comboBox_port_2->font(); + font.setStrikeOut(true); + } + else + { + font = ui->comboBox_port_2->font(); + font.setStrikeOut(false); + } + ui->comboBox_port_2->setFont(font); + ui->comboBox_port_2->addItem(info.portName() + "-" + info.description()); + }break; + default: + { + }break; + } + } +} + +//==========================================================================<槽函数> +/* @brief: 槽与信号的绑定 + * @para: + * @return: + */ +void MainWindow::Singel_Init(void) +{ + connect(ui->pushButton_start_1, &QPushButton::clicked, this, PushButton_start_clicked_Callback); // 开始按键点击事件绑定 + connect(ui->pushButton_start_2, &QPushButton::clicked, this, PushButton_start_clicked_Callback); // 开始按键点击事件绑定 + connect(ui->pushButton_stop_1, &QPushButton::clicked, this, PushButton_stop_clicked_Callback); // 结束按键点击事件绑定 + connect(ui->pushButton_stop_2, &QPushButton::clicked, this, PushButton_stop_clicked_Callback); // 结束按键点击事件绑定 + + connect(ui->pushButton_refresh_1, &QPushButton::clicked, this, PushButton_refresh_clicked_Callback); // 刷新按键点击事件绑定 + connect(ui->pushButton_refresh_2, &QPushButton::clicked, this, PushButton_refresh_clicked_Callback); // 刷新按键点击事件绑定 + + connect(this, &MainWindow::Signal_Serial_Open, &serial[SERIAL_1], &SerialPort::SerialPort_OpenSerial_Callback); + connect(this, &MainWindow::Signal_Serial_Open, &serial[SERIAL_2], &SerialPort::SerialPort_OpenSerial_Callback); +} + +/* @brief: 开启串口按键点击事件槽函数 + * @para: + * @return: + */ +void MainWindow::PushButton_start_clicked_Callback(void) +{ + QPushButton* btn = qobject_cast(sender()); + qDebug() << "<<<-----" << btn->objectName() << "Clicked ----->>>"; + + SERIAL_INFO info = {0}; + if (btn == ui->pushButton_start_1) + { + info.portName = ui->comboBox_port_1->currentText().split('-').at(0); // 获取端口号 + info.bandrate = ui->comboBox_band_1->currentText().toUInt(nullptr, 10); + info.timeOutCnt = ui->lineEdit_timeout_1->text().toUInt(nullptr, 10); + } + else if (btn == ui->pushButton_start_2) + { + info.portName = ui->comboBox_port_2->currentText().split('-').at(0); + info.bandrate = ui->comboBox_band_2->currentText().toInt(nullptr, 10); + info.timeOutCnt = ui->lineEdit_timeout_2->text().toUInt(nullptr, 10); + } + + qDebug() << info.portName << info.bandrate << info.timeOutCnt; + emit Signal_Serial_Open(&info); // 发送信号 +} + +/* @brief: 关闭串口按键点击事件槽函数 + * @para: + * @return: + */ +void MainWindow::PushButton_stop_clicked_Callback(void) +{ + QPushButton* btn = qobject_cast(sender()); + qDebug() << "<<<-----" << btn->objectName() << "Clicked ----->>>"; +} + +/* @brief: 刷新键点击事件槽函数 + * @para: + * @return: + */ +void MainWindow::PushButton_refresh_clicked_Callback(void) +{ + QPushButton* btn = qobject_cast(sender()); + qDebug() << "<<<-----" << btn->objectName() << "Clicked ----->>>"; + if (btn == ui->pushButton_refresh_1) + { + SerialPortInfoRefresh(1); + } + else if (btn == ui->pushButton_refresh_2) + { + SerialPortInfoRefresh(2); + } +} diff --git a/SerialSynTool/mainwindow.h b/SerialSynTool/mainwindow.h index 4643e32..fe2f8e0 100644 --- a/SerialSynTool/mainwindow.h +++ b/SerialSynTool/mainwindow.h @@ -2,6 +2,10 @@ #define MAINWINDOW_H #include +#include +#include + +#include "serialport.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } @@ -15,7 +19,22 @@ public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); + void UI_Init(void); // 控件初始化 + void Singel_Init(void); // 槽初始化 + + void SerialPortInfoRefresh(uint8_t serialIdx); // 串口信息数据刷新 + +private slots: // 槽函数 + void PushButton_start_clicked_Callback(void); // 开始按键点击事件绑定 + void PushButton_stop_clicked_Callback(void); // 结束按键点击事件绑定 + void PushButton_refresh_clicked_Callback(void); // 刷新按键点击事件绑定 + +signals: // 信号 + void Signal_Serial_Open(SERIAL_INFO* info); // 开启串口信号 + void Signal_Serial_Close(void); // 关闭串口信号 + private: Ui::MainWindow *ui; + SerialPort *serial; }; #endif // MAINWINDOW_H diff --git a/SerialSynTool/mainwindow.ui b/SerialSynTool/mainwindow.ui index b232854..20d9af8 100644 --- a/SerialSynTool/mainwindow.ui +++ b/SerialSynTool/mainwindow.ui @@ -6,17 +6,619 @@ 0 0 - 800 - 600 + 1393 + 920 MainWindow - - + + + + + + Qt::Horizontal + + + QSizePolicy::Maximum + + + + 10 + 20 + + + + + + + + + + + 0 + 0 + + + + + 0 + 230 + + + + 配置 + + + + + + + + 10 + + + + + font: 12pt "Adobe Arabic"; + + + 超时时间(ms) + + + + + + + font: 12pt "Adobe Arabic"; + + + 帧颜色 + + + + + + + + 0 + 25 + + + + font: 12pt "Adobe Arabic"; + + + #FF0000 + + + + + + + + 0 + 25 + + + + font: 12pt "Adobe Arabic"; + + + + + + + font: 12pt "Adobe Arabic"; + + + 端口 + + + + + + + + 0 + 25 + + + + font: 12pt "Adobe Arabic"; + + + 20 + + + + + + + font: 12pt "Adobe Arabic"; + + + 波特率 + + + + + + + + 0 + 25 + + + + font: 12pt "Adobe Arabic"; + + + 2400 + + + + 2400 + + + + + 4800 + + + + + 9600 + + + + + 115200 + + + + + + + + + 20 + 20 + + + + + 20 + 20 + + + + image: url(:/img/img/refresh.png); + + + + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 10 + 20 + + + + + + + + + 0 + 30 + + + + font: 12pt "Adobe Arabic"; + + + 开始 + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 10 + 20 + + + + + + + + + 0 + 30 + + + + font: 12pt "Adobe Arabic"; + + + 暂停 + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 10 + 20 + + + + + + + + + + + + Qt::Horizontal + + + + 318 + 20 + + + + + + + + Qt::Vertical + + + + + + + + + 10 + + + + + font: 12pt "Adobe Arabic"; + + + 超时时间(ms) + + + + + + + + 0 + 25 + + + + font: 12pt "Adobe Arabic"; + + + 20 + + + + + + + + 0 + 25 + + + + font: 12pt "Adobe Arabic"; + + + + + + + font: 12pt "Adobe Arabic"; + + + 波特率 + + + + + + + font: 12pt "Adobe Arabic"; + + + 端口 + + + + + + + + 0 + 25 + + + + font: 12pt "Adobe Arabic"; + + + 2400 + + + + 2400 + + + + + 4800 + + + + + 9600 + + + + + 115200 + + + + + + + + font: 12pt "Adobe Arabic"; + + + 帧颜色 + + + + + + + + 0 + 25 + + + + font: 12pt "Adobe Arabic"; + + + #0000FF + + + + + + + + 20 + 20 + + + + + 20 + 20 + + + + image: url(:/img/img/refresh.png); + + + + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 10 + 20 + + + + + + + + + 0 + 30 + + + + font: 12pt "Adobe Arabic"; + + + 开始 + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 10 + 20 + + + + + + + + + 0 + 30 + + + + font: 12pt "Adobe Arabic"; + + + 暂停 + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 10 + 20 + + + + + + + + + + + + Qt::Horizontal + + + + 318 + 20 + + + + + + + + + + + false + + + + 时间戳 + + + + + 数据 + + + + + 解析 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Maximum + + + + 10 + 20 + + + + + + + + + + 0 + 0 + 1393 + 22 + + + - + + + diff --git a/SerialSynTool/serialport.cpp b/SerialSynTool/serialport.cpp new file mode 100644 index 0000000..650747a --- /dev/null +++ b/SerialSynTool/serialport.cpp @@ -0,0 +1,46 @@ +#include "serialport.h" + +/* @brief: 构造函数 + * @para: + * @return: + */ +SerialPort::SerialPort(QObject *parent) : QObject(parent) +{ + thread = new QThread(); // 创建线程句柄 + serial = new QSerialPort(); // 创建串口句柄 +} + +/* @brief: 析构函数 + * @para: + * @return: + */ +SerialPort::~SerialPort() +{ + +} + +//==========================================================================<槽函数> +/* @brief: ui线程发送的打开串口的信号回调函数 + * @para: + * @return: + */ +void SerialPort::SerialPort_OpenSerial_Callback(SERIAL_INFO* info) +{ + qDebug() << "<<<-----Serial Opened Succssfully ----->>>"; + serial->setPortName(info->portName); + serial->setBaudRate(info->bandrate); + serial->setDataBits(QSerialPort::Data8); + serial->setStopBits(QSerialPort::OneStop); // 以为停止位 + serial->setParity(QSerialPort::NoParity); // 无奇偶校验 + serial->setFlowControl(QSerialPort::NoFlowControl); // 硬件控制 + + if(serial->open(QIODevice::ReadWrite)) + { + serial->moveToThread(thread); // 加入线程 + qDebug() << "<<<----- 串口打开成功,线程ID:" << serial->thread() << " ----->>>";; // 获取线程id + } + else + { + qDebug() << "串口打开失败"; + } +} diff --git a/SerialSynTool/serialport.h b/SerialSynTool/serialport.h new file mode 100644 index 0000000..14fcb32 --- /dev/null +++ b/SerialSynTool/serialport.h @@ -0,0 +1,45 @@ +#ifndef SERIALPORT_H +#define SERIALPORT_H + +#include +#include + +#include +#include +#include + +//========================================================================== +typedef enum +{ + SERIAL_1, + SERIAL_2, + SERIAL_NUM, +}SERIAL_IDX; // 串口编号 + +typedef struct +{ + QString portName; // 端口号 + uint32_t bandrate; // 波特率 + uint32_t timeOutCnt; // 超时时间 +}SERIAL_INFO; // 串口信息 + + + +class SerialPort : public QObject +{ + Q_OBJECT +public: + explicit SerialPort(QObject *parent = nullptr); + ~SerialPort(); + +signals: + +public slots: // 槽函数 + void SerialPort_OpenSerial_Callback(SERIAL_INFO* info); + +private: + QThread* thread; + QSerialPort* serial; +}; + +#endif // SERIALPORT_H diff --git a/_src/SRC.qrc b/_src/SRC.qrc new file mode 100644 index 0000000..a1f1b29 --- /dev/null +++ b/_src/SRC.qrc @@ -0,0 +1,5 @@ + + + img/refresh.png + + diff --git a/_src/img/refresh.png b/_src/img/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..5c139ef6c3108065ca2487401605bafff79749d7 GIT binary patch literal 7208 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