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 0000000..5c139ef Binary files /dev/null and b/_src/img/refresh.png differ