完成基本功能

This commit is contained in:
jiangyingjie 2024-08-29 17:33:25 +08:00
commit 003adac6bd
52 changed files with 4015 additions and 0 deletions

View File

@ -0,0 +1,31 @@
QT += core gui serialport
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

View File

@ -0,0 +1,319 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.11.1, 2024-08-14T13:15:48. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{b72ef07e-303d-4886-ad48-cd1f209eb895}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap">
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey">
<value type="QString">-fno-delayed-template-parsing</value>
</valuelist>
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.14.2 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.14.2 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5142.win64_mingw73_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/_SRC/_tools/PlugBoardCommTestTool/build-PlugBoardCommTestTool-Desktop_Qt_5_14_2_MinGW_64_bit-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/_SRC/_tools/PlugBoardCommTestTool/build-PlugBoardCommTestTool-Desktop_Qt_5_14_2_MinGW_64_bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/_SRC/_tools/PlugBoardCommTestTool/build-PlugBoardCommTestTool-Desktop_Qt_5_14_2_MinGW_64_bit-Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
<value type="QString">cpu-cycles</value>
</valuelist>
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
<value type="int" key="Analyzer.Perf.Frequency">250</value>
<valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
<value type="QString">-e</value>
<value type="QString">cpu-cycles</value>
<value type="QString">--call-graph</value>
<value type="QString">dwarf,4096</value>
<value type="QString">-F</value>
<value type="QString">250</value>
</valuelist>
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/_SRC/_tools/PlugBoardCommTestTool/PlugBoardCommTestTool/PlugBoardCommTestTool.pro</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">D:/_SRC/_tools/PlugBoardCommTestTool/PlugBoardCommTestTool/PlugBoardCommTestTool.pro</value>
<value type="QString" key="RunConfiguration.Arguments"></value>
<value type="bool" key="RunConfiguration.Arguments.multi">false</value>
<value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/_SRC/_tools/PlugBoardCommTestTool/build-PlugBoardCommTestTool-Desktop_Qt_5_14_2_MinGW_64_bit-Release</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">22</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>

View File

@ -0,0 +1,11 @@
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

View File

@ -0,0 +1,844 @@
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
Init();
SerialPortInfo_Init();
Config_Init(); // 文件初始化
BindSlot(); // 槽函数 绑定
}
MainWindow::~MainWindow()
{
DeInit();
delete ui;
}
/* @brief: 相关句柄的初始化
* @para: void
* @return: void
*/
void MainWindow::Init()
{
this->serial = new QSerialPort;
this->settings = new QSettings(CONFIG_FILE_LOCATION, QSettings::IniFormat);
this->recvTimer = new QTimer;
this->loopTimer = new QTimer;
recvTimer->setSingleShot(true); // 单次模式
loopTimer->setSingleShot(true); // 单次模式
// ui初始化
ui->textEdit_receive->document()->setMaximumBlockCount(500); //最多500行
}
/* @brief: 去初始化
* @para: void
* @return: void
*/
void MainWindow::DeInit()
{
delete recvTimer;
delete loopTimer;
delete settings;
delete serial;
}
/* @brief: 串口信息初始化
* @para: void
* @return: void
*/
void MainWindow::SerialPortInfo_Init()
{
ui->comboBox_port->clear(); // 清除数据
for (QSerialPortInfo serialPortInfo : QSerialPortInfo::availablePorts())
{
ui->comboBox_port->addItem(serialPortInfo.portName() + " [" + serialPortInfo.description() + ']');
}
}
/* @brief: 文件相关初始化
* @para: void
* @return: void
*/
void MainWindow::Config_Init()
{
// 配置文件 configuration 键值需要为true否则是为没有配置文件或配置文件异常需要清空配置文件随后重新初始化
if (this->settings->value("configuration", false).toInt() != 1)
{
this->settings->clear();
this->Config_SettingInit();
}
this->Config_SettingUpdate(); // 更新界面显示
}
/* @brief: 初始化配置文件
* @para: void
* @return: void
*/
void MainWindow::Config_SettingInit()
{
QCheckBox *checkBox = new QCheckBox;
this->settings->setValue("configuration", 1);
for (uint16_t i = 0; i <= 0xff; i++)
{
if (i % 16 == 0) // 16的倍数为全选框的配置
{
checkBox = this->findChild<QCheckBox *>(tr("checkBox_mix_%1x").arg(i / 16, 1, 16));
if (checkBox != nullptr)
{
this->settings->setValue(checkBox->objectName(), 0); // 初始化设置为不勾选
}
}
checkBox = this->findChild<QCheckBox *>(tr("checkBox_mix_%1").arg(i, 2, 16, QLatin1Char('0')));
if (checkBox != nullptr)
{
this->settings->setValue(checkBox->objectName(), 0); // // 初始化设置为不勾选
}
}
}
/* @brief: 配置文件更新显示
* @para: void
* @return: void
*/
void MainWindow::Config_SettingUpdate()
{
QCheckBox *checkBox = new QCheckBox;
QString checkBoxName = NULL;
int ret = 0;
for (uint16_t i = 0; i <= 0xff; i++)
{
if (i % 16 == 0) // 16的倍数为全选框的配置
{
checkBoxName = tr("checkBox_mix_%1x").arg(i / 16, 1, 16);
ret = this->settings->value(checkBoxName, -1).toInt();
if (ret != -1)
{
checkBox = this->findChild<QCheckBox *>(checkBoxName);
checkBox->setChecked((bool)ret);
}
}
checkBoxName = tr("checkBox_mix_%1").arg(i, 2, 16, QLatin1Char('0'));
ret = this->settings->value(checkBoxName, -1).toInt();
if (ret != -1)
{
checkBox = this->findChild<QCheckBox *>(checkBoxName);
checkBox->setChecked((bool)ret);
}
}
}
/* @brief: 计算数据的校验和
* @para: uint8_t*
* @return: uint8_t
*/
uint8_t MainWindow::Serial_GetSumCheck(uint8_t* array)
{
uint8_t cs = 0;
cs += array[SERIAL_COMM_INDEX_ADDR];
cs += array[SERIAL_COMM_INDEX_LEN];
for (uint8_t i = 0; i < array[SERIAL_COMM_INDEX_LEN]; i++)
{
cs += array[i + 4];
}
return cs;
}
/* @brief: 接收到串口数据后进行数据刷新
* @para:
* @return: void
*/
void MainWindow::Serial_UpdateData(uint8_t* array)
{
uint8_t mixIndex = array[SERIAL_COMM_INDEX_MIXINDEX];
uint16_t mixData = array[SERIAL_COMM_INDEX_MIXDATA] << 8 | array[SERIAL_COMM_INDEX_MIXDATA + 1];
PLUG_BOARD_POWER_STATUS_UNION powerStatus; // 电源上传的32位标志位
powerStatus.inWord = ((uint32_t)(array[SERIAL_COMM_INDEX_STATUS] << 24) |
(uint32_t)(array[SERIAL_COMM_INDEX_STATUS + 1] << 16) |
(uint32_t)(array[SERIAL_COMM_INDEX_STATUS + 2] << 8) |
(uint32_t)(array[SERIAL_COMM_INDEX_STATUS + 3]));
// 32位状态位显示
for (uint8_t i = 0; i < 32; i++)
{
QLabel* label = this->findChild<QLabel*>(QString("label_statusbits_%1").arg(i));
if (label)
{
if (powerStatus.inWord & (1 << i)) // 如果为1
{
label->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); // 设置样式表
switch (i)
{
case 0:
label->setText("应急");
break;
case 1:
label->setText("强起");
break;
case 2:
case 7:
label->setText("手动");
break;
case 3:
case 4:
case 5:
case 6:
case 27:
case 29:
case 30:
label->setText("故障");
break;
default:
label->setText("有效");
break;
}
}
else // 如果为0
{
label->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); // 设置样式表
switch (i)
{
case 2:
case 7:
label->setText("自动");
break;
case 3:
case 4:
case 5:
case 6:
case 27:
case 29:
case 30:
label->setText("正常");
break;
default:
label->setText("无效");
break;
}
}
}
}
// 融合数据显示
QLabel *label = this->findChild<QLabel *>(tr("label_mix_%1").arg(mixIndex, 2, 16, QLatin1Char('0')));
static QLabel* lastLabel = nullptr; // 保存上一次刷新的label控件
if (label)
{
label->clear(); // 清除当前文字显示
if (lastLabel)
{
lastLabel->setStyleSheet("QLabel{background-color:yellow;}"); // 重置上一个label的样式表
}
label->setStyleSheet("QLabel{background-color:#c8ffff;}"); // 显示当前需要刷新的控件的样式表
// 进行融合数据的显示
switch (mixIndex) // 判断融合数据索引
{
case 0x01: // 版本号
{
QString str = QString::number(array[10]) + QString::number(array[11]).asprintf("%02d", array[11]);
label->setText(str);
}
break;
case 0x02: // 回路数量
{
QString str = QString::number(mixData);
label->setText(str);
}
break;
case 0x03: // 备电数量
{
QString str = QString::number(mixData);
label->setText(str);
}
break;
case 0x04: // 电源设置
{
QString str = QString::number(mixData, 16);
label->setText(str);
}
break;
case 0x05: // 备电调试模式
{
QString str = QString::number(mixData, 16);
label->setText(str);
}
break;
case 0x10: // 主电电压
{
QString str = QString::number(mixData);
label->setText(str + " V");
}
break;
case 0x11: // 输出电压
{
QString str = QString::number(mixData);
label->setText(str + " mV");
}
break;
case 0x12: // 输出电流
{
QString str = QString::number(mixData);
label->setText(str + " mA");
}
break;
case 0x13: // 电池电压
{
QString str = QString::number(mixData);
label->setText(str + " mV");
}
break;
case 0x14: // 充电电流
{
QString str = QString::number(mixData);
label->setText(str + " mA");
}
break;
case 0x1f: // 备电切断电压
{
QString str = QString::number(mixData);
label->setText(str + " mV");
}
break;
case 0x20: // 欠压电池
{
QString str = QString::number(mixData, 16);
label->setText(str);
}
break;
case 0x21: // 过放电池
{
QString str = QString::number(mixData, 16);
label->setText(str);
}
break;
case 0x22: // 过压电池
{
QString str = QString::number(mixData, 16);
label->setText(str);
}
break;
case 0x23: // 开路电池
{
QString str = QString::number(mixData, 16);
label->setText(str);
}
break;
case 0x24: // 短路电池
{
QString str = QString::number(mixData, 16);
label->setText(str);
}
break;
case 0x30: // 开路回路
{
QString str = QString::number(mixData, 16);
label->setText(str);
}
break;
case 0x31: // 短路回路
{
QString str = QString::number(mixData, 16);
label->setText(str);
}
break;
case 0x32: // 熔断保险丝
{
QString str = QString::number(mixData, 16);
label->setText(str);
}
break;
case 0x33: // 过载回路
{
QString str = QString::number(mixData, 16);
label->setText(str);
}
break;
case 0x40: // 电源地址码
{
QString str = QString::number(mixData);
label->setText(str);
}
break;
case 0x41: // can波特率设置
{
QString str = QString::number(mixData);
label->setText(str);
}
break;
case 0x42: // 灯具亮度等级
{
QString str = QString::number(mixData);
label->setText(str);
}
break;
case 0x50: // 电池1温度
{
QString str1 = nullptr, str2 = nullptr;
if(array[10] & 0x80)
{
str1 += "包:-";
}
else
{
str1 += "包:";
}
str1 += QString::number(array[10] & 0x7f);
if(array[11] & 0x80)
{
str2 += "内:-";
}
else
{
str2 += "内:";
}
str2 += QString::number(array[11] & 0x7f);
label->setText(str1 + " " + str2);
}
break;
break;
case 0xa0: // 回路电流_1
{
QString str = QString::number(mixData);
label->setText(str + " mA");
}
break;
case 0xa1: // 回路电流_2
{
QString str = QString::number(mixData);
label->setText(str + " mA");
}
break;
case 0xa2: // 回路电流_3
{
QString str = QString::number(mixData);
label->setText(str + " mA");
}
break;
case 0xa3: // 回路电流_4
{
QString str = QString::number(mixData);
label->setText(str + " mA");
}
break;
case 0xa4: // 回路电流_5
{
QString str = QString::number(mixData);
label->setText(str + " mA");
}
break;
case 0xa5: // 回路电流_6
{
QString str = QString::number(mixData);
label->setText(str + " mA");
}
break;
case 0xa6: // 回路电流_7
{
QString str = QString::number(mixData);
label->setText(str + " mA");
}
break;
case 0xa7: // 回路电流_8
{
QString str = QString::number(mixData);
label->setText(str + " mA");
}
break;
case 0xb0: // 电池电压1
{
QString str = QString::number(mixData);
label->setText(str + " mV");
}
break;
case 0xb1: // 电池电压2
{
QString str = QString::number(mixData);
label->setText(str + " mV");
}
break;
case 0xb2: // 电池电压3
{
QString str = QString::number(mixData);
label->setText(str + " mV");
}
break;
case 0xff: // 获取额定功率
{
QString str = QString::number(array[11] << 8 | array[10]);
label->setText(str + " W");
}
break;
}
lastLabel = label; // 保存上一次刷新的
}
}
/* @brief: [槽函数],融合数据查询按钮回调函数
* @para: QByteArray:
* @return: void
*/
void MainWindow::Serial_SendData(QByteArray senddata)
{
if (this->serial->isOpen())
{
this->serial->write(senddata);
}
else
{
QMessageBox messageBox;
messageBox.setIcon(QMessageBox::Warning);
messageBox.setWindowTitle("警告");
messageBox.setText("请先打开串口");
messageBox.exec();
}
}
/*****************************************************<槽函数>*/
/* @brief: [槽函数],融合数据查询按钮回调函数
* @para: void
* @return: void
*/
void MainWindow:: pushButton_mix_clicked_callback()
{
QPushButton *btn = qobject_cast<QPushButton *>(sender()); // 获取信号的发送者
uint8_t mixIndex = btn->text().mid(1, 2).toUInt(nullptr, 16); // 转16进制
uint8_t sendbuf[] = {0x78, 0x02, 0x09, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, mixIndex, 0x00, 0x17};
sendbuf[SERIAL_COMM_INDEX_CS] = Serial_GetSumCheck(sendbuf);
Serial_SendData(QByteArray(reinterpret_cast<char *>(sendbuf), sizeof(sendbuf) / sizeof(sendbuf[0])));
}
/* @brief: [槽函数],融合数据查询按钮回调函数
* @para: void
* @return: void
*/
void MainWindow:: pushButton_mixsend_clicked_callback()
{
QPushButton *btn = qobject_cast<QPushButton *>(sender()); // 获取信号的发送者
uint8_t mixIndex = btn->text().mid(1, 2).toUInt(nullptr, 16); // 转16进制
QLineEdit *lineEdit = this->findChild<QLineEdit*>("lineEdit_mixsend_" + btn->text().mid(1, 2));
if (lineEdit)
{
uint8_t sendbuf[] = {0x78, 0x02, 0x09, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, mixIndex, 0x00, 0x00, 0x00, 0x00, 0x17};
uint16_t mixData = lineEdit->text().toUShort(nullptr, 10);
sendbuf[SERIAL_COMM_INDEX_MIXDATA] = (uint8_t)(mixData >> 8);
sendbuf[SERIAL_COMM_INDEX_MIXDATA + 1] = (uint8_t)(mixData);
sendbuf[SERIAL_COMM_INDEX_CS] = Serial_GetSumCheck(sendbuf);
Serial_SendData(QByteArray(reinterpret_cast<char *>(sendbuf), sizeof(sendbuf) / sizeof(sendbuf[0])));
}
}
/* @brief: [槽函数],命令按钮回调函数
* @para: void
* @return: void
*/
void MainWindow:: pushButton_cmd_clicked_callback()
{
QPushButton *btn = qobject_cast<QPushButton *>(sender()); // 获取信号的发送者
uint8_t cmd = btn->text().mid(1, 2).toUInt(nullptr, 16); // 转16进制
uint8_t sendbuf[] = {0x78, 0x02, 0x09, 0x78, cmd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17};
sendbuf[SERIAL_COMM_INDEX_CS] = Serial_GetSumCheck(sendbuf);
Serial_SendData(QByteArray(reinterpret_cast<char *>(sendbuf), sizeof(sendbuf) / sizeof(sendbuf[0])));
}
/* @brief: [槽函数],全选框回调函数
* @para: void
* @return: void
*/
void MainWindow::checkbox_mix_all_stateChanged_callback()
{
QCheckBox* checkbox_all = qobject_cast<QCheckBox *>(sender()); // 获取信号的发送者
QCheckBox* checkbox_singal = new QCheckBox;
QString section = checkbox_all->objectName().mid(13, 1);
int ret = checkbox_all->isChecked();
this->settings->setValue(checkbox_all->objectName(), ret);
for (uint8_t i = 0; i <= 0x0f; i++)
{
checkbox_singal = this->findChild<QCheckBox *>(tr("checkBox_mix_%1%2").arg(section).arg(i, 1, 16));
if (checkbox_singal)
{
this->settings->setValue(checkbox_singal->objectName(), ret);
checkbox_singal->setChecked(checkbox_all->isChecked());
}
}
}
/* @brief: [槽函数],单个选中该框回调函数
* @para: void
* @return: void
*/
void MainWindow::checkbox_mix_single_stateChanged_callback()
{
QCheckBox* checkbox = qobject_cast<QCheckBox *>(sender()); // 获取信号的发送者
int data = checkbox->isChecked();
this->settings->setValue(checkbox->objectName(), data);
}
/* @brief: [槽函数],循环发送框回调函数
* @para: void
* @return: void
*/
void MainWindow::checkbox_mix_loop_stateChanged_callback()
{
if (ui->checkBox_mix_loop->isChecked())
{
if (this->serial->isOpen())
{
loopTimer->start(ui->lineEdit_looptime->text().toUInt());
}
else
{
QMessageBox messageBox;
messageBox.setIcon(QMessageBox::Warning);
messageBox.setWindowTitle("警告");
messageBox.setText("请先打开串口");
messageBox.exec();
ui->checkBox_mix_loop->setChecked(false);
}
}
else
{
loopTimer->stop();
}
}
/* @brief: [槽函数],端口刷新回调函数
* @para: void
* @return: void
*/
void MainWindow::pushButton_refresh_clicked_callback()
{
this->SerialPortInfo_Init();
}
/* @brief: [槽函数],开启串口按钮回调函数
* @para: void
* @return: void
*/
void MainWindow::pushButton_open_clicked_callback()
{
QStringList portStrList = ui->comboBox_port->currentText().split(" ["); // 获取端口号
this->serial->setPortName(portStrList.at(0)); // 设置端口号
this->serial->setBaudRate(ui->comboBox_bandrate->currentText().toUInt()); // 获取波特率
this->serial->setDataBits(QSerialPort::Data8); // 串口数据位数
this->serial->setStopBits(QSerialPort::OneStop); // 以为停止位
this->serial->setParity(QSerialPort::NoParity); // 无奇偶校验
this->serial->setFlowControl(QSerialPort::NoFlowControl); // 硬件控制
if (this->serial->open(QIODevice::ReadWrite)) // 打开成功
{
ui->pushButton_open->setDisabled(true);
ui->pushButton_close->setEnabled(true);
ui->comboBox_port->setDisabled(true);
ui->pushButton_refresh->setDisabled(true);
ui->comboBox_bandrate->setDisabled(true);
}
else
{
ui->pushButton_open->setEnabled(true);
ui->pushButton_close->setDisabled(true);
ui->comboBox_port->setEnabled(true);
ui->pushButton_refresh->setEnabled(true);
ui->comboBox_bandrate->setEnabled(true);
}
}
/* @brief: [槽函数],关闭串口按钮回调函数
* @para: void
* @return: void
*/
void MainWindow::pushBurron_close_clicked_callback()
{
if (serial->isOpen())
{
recvTimer->stop(); // 关闭接收定时器
loopTimer->stop(); // 关闭循环发送定时器
serial->close(); // 关闭串口
ui->pushButton_open->setEnabled(true);
ui->pushButton_close->setDisabled(true);
ui->comboBox_port->setEnabled(true);
ui->pushButton_refresh->setEnabled(true);
ui->comboBox_bandrate->setEnabled(true);
ui->checkBox_mix_loop->setChecked(false);
}
}
/* @brief: [槽函数],串口接收到数据回调函数
* @para: void
* @return: void
*/
void MainWindow::qserail_readyread_callback()
{
this->recvTimer->start(ui->lineEdit_timeout->text().toUInt()); // 开启接收超时定时器
recvByteArray.append(serial->readAll()); // 读取接收数据
}
/* @brief: [槽函数],串口接收超时回调函数
* @para: void
* @return: void
*/
void MainWindow::recvtimer_timeout_callback()
{
QString timeStr = QDateTime::currentDateTime().toString(); // 获取时间戳
uint8_t recvBuf[SERIAL_BUF_MAXSIZE] = {0};
QByteArray dataStr = nullptr;
/********** 接收数据的显示 **********/
for(uint8_t i = 0; i < recvByteArray.toHex().length(); i += 2)
{
dataStr += "0x" + recvByteArray.toHex().mid(i, 2) + ' '; // 转化为十六进制
}
ui->textEdit_receive->insertPlainText('[' + timeStr + "] " + dataStr);
/********** 进行接收数据的解析 **********/
memcpy(recvBuf, recvByteArray.data(), recvByteArray.length()); // 将QByteArray转化为uint8_t
// 帧头帧尾的判断
if (recvBuf[SERIAL_COMM_INDEX_HEAD] == SERIAL_COMM_HEAD && \
recvBuf[recvBuf[SERIAL_COMM_INDEX_LEN] + 5] == SERIAL_COMM_TIAL)
{
// 校验和判断
if (Serial_GetSumCheck(recvBuf) == recvBuf[recvBuf[SERIAL_COMM_INDEX_LEN] + 4])
{
ui->textEdit_receive->insertPlainText(" [sumcheck - OK]\n");
this->Serial_UpdateData(recvBuf); // 进行数据显示
}
else
{
ui->textEdit_receive->insertPlainText(" [sumcheck - ERROR]\n");
}
}
else
{
ui->textEdit_receive->insertPlainText(" [head&tail - ERROR]\n");
}
recvByteArray.clear(); // 清除接收数据
ui->textEdit_receive->moveCursor(QTextCursor::End); // 自动滚动
}
/* @brief: [槽函数],循环发送定时到回调函数
* @para: void
* @return: void
*/
void MainWindow::looptimer_timeout_callback()
{
loopTimer->start(ui->lineEdit_looptime->text().toUInt());
QCheckBox* checkBox = nullptr;
QPushButton* btn = nullptr;
do
{
btn = this->findChild<QPushButton *>(QString("pushButton_mix_%1").arg(loopIndex, 2, 16, QLatin1Char('0')));
checkBox = this->findChild<QCheckBox *>(QString("checkBox_mix_%1").arg(loopIndex++, 2, 16, QLatin1Char('0')));
}while(!btn || !checkBox || !checkBox->isChecked());
btn->click(); // 手动触发
}
/* @brief: 绑定槽函数,用于部分控件回调函数绑定
* @para: void
* @return: void
*/
void MainWindow::BindSlot()
{
QCheckBox* checkbox = new QCheckBox;
QPushButton* btn = new QPushButton;
// 融合数据索引按钮
for (uint16_t i = 0; i <= 0xff; i++)
{
btn = this->findChild<QPushButton *>(tr("pushButton_mix_%1").arg(i, 2, 16, QLatin1Char('0'))); // 宽度2不足补0
if (btn)
{
connect(btn, &QPushButton::clicked, this, &MainWindow::pushButton_mix_clicked_callback);
}
}
// 融合数据发送按钮
for (uint16_t i = 0; i <= 0xff; i++)
{
btn = this->findChild<QPushButton *>(tr("pushButton_mixsend_%1").arg(i, 2, 16, QLatin1Char('0'))); // 宽度2不足补0
if (btn)
{
connect(btn, &QPushButton::clicked, this, &MainWindow::pushButton_mixsend_clicked_callback);
}
}
// 命令按钮
for (uint16_t i = 0; i <= 0xff; i++)
{
btn = this->findChild<QPushButton *>(tr("pushButton_cmd_%1").arg(i, 2, 16, QLatin1Char('0'))); // 宽度2不足补0
if (btn)
{
connect(btn, &QPushButton::clicked, this, &MainWindow::pushButton_cmd_clicked_callback);
}
}
// 全选框
for (uint8_t i = 0; i <= 0xf; i++)
{
checkbox = this->findChild<QCheckBox *>(tr("checkBox_mix_%1x").arg(i, 0, 16));
if (checkbox)
{
connect(checkbox, &QCheckBox::stateChanged, this, &MainWindow::checkbox_mix_all_stateChanged_callback);
}
}
// 单个选择发送函数
for (uint16_t i = 0; i <= 0xff; i++)
{
checkbox = this->findChild<QCheckBox *>(tr("checkBox_mix_%1").arg(i, 2, 16, QLatin1Char('0')));
if (checkbox)
{
connect(checkbox, &QCheckBox::stateChanged, this, &MainWindow::checkbox_mix_single_stateChanged_callback);
}
}
// 循环发送框
connect(ui->checkBox_mix_loop, &QCheckBox::stateChanged, this, &MainWindow::checkbox_mix_loop_stateChanged_callback);
// 端口刷新按钮回调函数
connect(ui->pushButton_refresh, &QPushButton::clicked, this, &MainWindow::pushButton_refresh_clicked_callback);
// 打开串口按钮回调函数
connect(ui->pushButton_open, &QPushButton::clicked, this, &MainWindow::pushButton_open_clicked_callback);
// 关闭串口按钮回调函数
connect(ui->pushButton_close, &QPushButton::clicked, this,&MainWindow::pushBurron_close_clicked_callback);
// 清除接收显示回调函数
connect(ui->pushButton_clear, &QPushButton::clicked, this, [=](){
ui->textEdit_receive->clear();
});
// 串口接收数据回调函数
connect(serial, &QSerialPort::readyRead, this, &MainWindow::qserail_readyread_callback);
// 串口接收超时回调函数
connect(this->recvTimer, &QTimer::timeout, this, &MainWindow::recvtimer_timeout_callback);
// 循环发送定时器定时达到回调函数
connect(loopTimer, &QTimer::timeout, this, &MainWindow::looptimer_timeout_callback);
// 十六进制发送按钮回调
connect(ui->pushButton_send, &QPushButton::clicked, this, [=](){
Serial_SendData(QByteArray::fromHex(ui->lineEdit_send->text().toLocal8Bit()));
});
}

View File

@ -0,0 +1,152 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSerialPort>
#include <qserialportinfo>
#include <QSettings>
#include <QTimer>
#include <QDebug>
#include <QDateTime> // 日期
#include <QMessageBox>
#define RESET "\033[0m"
#define RED "\033[31m" /* Red */
#define GREEN "\033[32m" /* Green */
#define CONFIG_FILE_LOCATION "./config.ini" // 配置文件的存储路径
#define SERIAL_BUF_MAXSIZE 50 // 串口通信缓存大小
#define SERIAL_COMM_HEAD 0x78 // 串口数据帧头
#define SERIAL_COMM_TIAL 0x17 // 串口数据帧尾
typedef enum
{
SERIAL_COMM_INDEX_HEAD = 0, // 帧头索引
SERIAL_COMM_INDEX_ADDR = 1, // 地址索引
SERIAL_COMM_INDEX_LEN = 2, // 帧长度索引
SERIAL_COMM_INDEX_STATUS = 5, // 32位标志位索引
SERIAL_COMM_INDEX_MIXINDEX = 9, // 融合数据索引
SERIAL_COMM_INDEX_MIXDATA = 10, // 融合数据
SERIAL_COMM_INDEX_MIXASK = 12, // 需要查询的融合数据索引
SERIAL_COMM_INDEX_CS = 13, // 校验和
}SERIAL_COMM_INDEX;
typedef struct
{
uint32_t Emergency_Flag : 1; // 应急状态[0:无效 1:有效]
uint32_t forceButtonFlg : 1; // 强启开关[0:无效 1:有效]
uint32_t WorkingModeBatMaintain : 1; // 手自动模式[0:自动 1:手动]
uint32_t mainPowerLostFlg : 1; // 主电状态[0:正常 1:丢失]
uint32_t outPutERR : 1; // 输出故障[0:正常 1:故障]
uint32_t batErrFlg : 1; // 备电故障[0:正常 1:故障]
uint32_t LOOPERR : 1; // 输出状态[0:正常 1:故障]
uint32_t METOD_AUTO_ERR : 1; // 自检状态[0:正常 1:故障]
uint32_t isAC220Lost : 1; // 联动控制端2状态[0:无效 1:有效] //220V市电
uint32_t dryNode : 1; // 联动控制端3状态[0:无效 1:有效] //干接点
uint32_t outPutOCFlg : 1; // 输出开路状态[0:无效 1:开路]
uint32_t outPutOLFlg : 1; // 输出过载状态[0:正常 1:过载]
uint32_t Start_Comp_Flag : 1; // 启动完成状态[0:无效 1:有效]
uint32_t batOCFlg : 1; // 电池端口开路状态[0:无效 1:开路]
uint32_t batSCFlg : 1; // 电池端口短路状态[0:无效 1:短路]
uint32_t batSampleLineErrFlg : 1; // 电池采样线故障[0:无效 1:故障]
uint32_t batUVFlg : 1; // 电池电压低于欠压点[0:无效 1:欠压]
uint32_t batUCVFlg : 1; // 电池电压低于切断点[0:无效 1:欠压]
uint32_t batOVFlg : 1; // 电池电压高于最大预设电压[0:无效 1:过压]
uint32_t : 1; // reserve
uint32_t chargingFlg : 1; // 充电中状态[0:无效 1:充电]
uint32_t chargeCpltFlg : 1; // 充电完成状态[0:无效 1:充满]
uint32_t LOOPOCFlg : 1; // 路由开路状态[0:无效 1:开路]
uint32_t LOOPSCFlg : 1; // 路由短路状态[0:无效 1:短路]
uint32_t FUSEOCFlg : 1; // 保险丝开路状态[0:无效 1:开路]
uint32_t LOOPOLFlg : 1; // 回路过载状态[0:正常 1:过载]
uint32_t reserve1 : 1;
uint32_t reserve2 : 1;
uint32_t AC220ENStatus : 1; // 市电检测使能标志[0:未使能 1:使能]
uint32_t reserve4 : 1;
uint32_t reserve5 : 1;
uint32_t reserve6 : 1;
} PLUG_BOARD_STATUS_TypeDef;
typedef union
{
PLUG_BOARD_STATUS_TypeDef inBit;
uint32_t inWord;
} PLUG_BOARD_POWER_STATUS_UNION;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void pushButton_mix_clicked_callback(); // 融合数据查询按钮回调函数
void pushButton_mixsend_clicked_callback(); // 融合数据发送按钮回调函数
void pushButton_cmd_clicked_callback(); // 指令按钮回调函数
void checkbox_mix_all_stateChanged_callback(); // 全选框回调函数
void checkbox_mix_single_stateChanged_callback(); // 单个选中框回调函数
void checkbox_mix_loop_stateChanged_callback(); // 循环发送框回调函数
void pushButton_refresh_clicked_callback(); // 端口刷新回调函数
void pushButton_open_clicked_callback(); // 打开串口回调函数
void pushBurron_close_clicked_callback(); // 关闭串口回调函数
void qserail_readyread_callback(); // 串口准备读取回调函数
void recvtimer_timeout_callback(); // 串口接收超时回调函数
void looptimer_timeout_callback(); // 循环发送定时器定时到回调函数
private:
Ui::MainWindow *ui;
QSerialPort *serial = nullptr; // 串口句柄
QSettings *settings = nullptr; // 配置文件
QTimer* recvTimer = nullptr; // 串口接收定时器
QTimer* loopTimer = nullptr; // 串口循环发送定时器
QByteArray recvByteArray = nullptr; // 串口接收数据
uint8_t loopIndex = 0; // 循环发送索引
void Init(); // 句柄初始化函数
void DeInit(); // 去初始化
void BindSlot(); // 槽函数绑定
void SerialPortInfo_Init(); // 串口信息初始化
void Config_Init(); // 文件相关初始化
void Config_SettingInit(); // 配置文件初始化
void Config_SettingUpdate(); // 配置文件更新显示
uint8_t Serial_GetSumCheck(uint8_t *array); // 获取校验和
void Serial_UpdateData(uint8_t* array); // 更新串口数据
void Serial_SendData(QByteArray senddata); // 串口发送数据
};
#endif // MAINWINDOW_H

File diff suppressed because it is too large Load Diff

31
README.md Normal file
View File

@ -0,0 +1,31 @@
# 更新列表
| 更新时间 | 更新内容 |
| ---------- | ------------------------------------------------------------ |
| 2024-07-18 | 1. 完成循环发送功能<br>2. 实现指令的发送功能以及输入框的发送功能<br>3. 调整布局<br> |
| 2024-07-17 | 1. 完成部分循环发送定时器逻辑处理<br>2. 增加插板通信32位状态位以及融合数据内容的解析<br>3. 调整开启/关闭串口按键在使能和禁用时的样式表<br>4. 增加串口接收超时和显示的逻辑,完成串口接收功能<br> |
| 2024-07-12 | 1. 完成串口配置功能<br>2. 完成串口 开启和关闭的功能<br> |
| 2024-07-11 | 1. 完成多选框配置文件的写入和读取操作<br>2. 完成页面的基本绘制<br> |
| 2024-07-09 | 1. 修改配置文件读写的方法QFile -> QSettings<br>2. 实现单选框配置文件的写入和读取操作<br> |
| 2024-06-28 | 1. 增加配置文件的创建读取和初始化写入操作<br> |
| 2024-06-25 | 1. 完成融合数据以及32位状态位的界面绘制和控件摆放<br>2. 完成融合数据全选框以及单个按钮的回调逻辑框架<br> |
# TODO
- [x] 增加多选框配置文件的写入和读取操作
- [x] 单选框和多选框的逻辑如何处理
- [ ] 串口功能的实现
- [ ] 串口与显示多线程处理

BIN
release/D3Dcompiler_47.dll Normal file

Binary file not shown.

Binary file not shown.

BIN
release/Qt5Core.dll Normal file

Binary file not shown.

BIN
release/Qt5Gui.dll Normal file

Binary file not shown.

BIN
release/Qt5SerialPort.dll Normal file

Binary file not shown.

BIN
release/Qt5Svg.dll Normal file

Binary file not shown.

BIN
release/Qt5Widgets.dll Normal file

Binary file not shown.

47
release/config.ini Normal file
View File

@ -0,0 +1,47 @@
[General]
configuration=1
checkBox_mix_0x=0
checkBox_mix_01=0
checkBox_mix_02=0
checkBox_mix_03=0
checkBox_mix_04=0
checkBox_mix_05=0
checkBox_mix_1x=0
checkBox_mix_10=0
checkBox_mix_11=0
checkBox_mix_12=0
checkBox_mix_13=0
checkBox_mix_14=0
checkBox_mix_1f=0
checkBox_mix_2x=1
checkBox_mix_20=1
checkBox_mix_21=1
checkBox_mix_22=1
checkBox_mix_23=1
checkBox_mix_24=1
checkBox_mix_3x=0
checkBox_mix_30=0
checkBox_mix_31=0
checkBox_mix_32=0
checkBox_mix_33=0
checkBox_mix_4x=0
checkBox_mix_40=0
checkBox_mix_41=0
checkBox_mix_42=0
checkBox_mix_5x=0
checkBox_mix_50=1
checkBox_mix_ax=0
checkBox_mix_a0=1
checkBox_mix_a1=1
checkBox_mix_a2=1
checkBox_mix_a3=1
checkBox_mix_a4=0
checkBox_mix_a5=0
checkBox_mix_a6=0
checkBox_mix_a7=0
checkBox_mix_bx=0
checkBox_mix_b0=0
checkBox_mix_b1=0
checkBox_mix_b2=0
checkBox_mix_fx=0
checkBox_mix_ff=0

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
release/libEGL.dll Normal file

Binary file not shown.

BIN
release/libGLESv2.dll Normal file

Binary file not shown.

BIN
release/opengl32sw.dll Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.