From 1e41597024ce641a9584184b7078058ddc04850a Mon Sep 17 00:00:00 2001 From: yuntang <123@qq.com> Date: Mon, 17 Mar 2025 17:30:54 +0800 Subject: [PATCH] 2025-03-17T17:30:53 --- src/.vscode/launch.json | 23 ++++++ src/.vscode/settings.json | 3 + src/AnalysTool.pro | 5 +- src/CMakeLists.txt | 21 +++++ src/data/filemanager.cpp | 55 +++++++++++++ src/data/filemanager.h | 16 ++++ src/global.h | 6 +- src/main.cpp | 5 +- src/mainwindow.cpp | 10 +-- src/serialport/serialport.cpp | 134 ++++++++++++++++++++++--------- src/serialport/serialport.h | 4 +- src/src/main.cpp | 12 +++ src/src/qt_new_proj.cpp | 13 +++ src/src/qt_new_proj.h | 14 ++++ src/src/qt_new_proj.ui | 22 +++++ src/ui/centralwidget.cpp | 1 + src/ui/experimentsettingform.cpp | 6 +- src/ui/experimentsettingform.h | 4 +- src/ui/experimentsettingform.ui | 4 +- 19 files changed, 301 insertions(+), 57 deletions(-) create mode 100644 src/.vscode/launch.json create mode 100644 src/.vscode/settings.json create mode 100644 src/CMakeLists.txt create mode 100644 src/data/filemanager.cpp create mode 100644 src/data/filemanager.h create mode 100644 src/src/main.cpp create mode 100644 src/src/qt_new_proj.cpp create mode 100644 src/src/qt_new_proj.h create mode 100644 src/src/qt_new_proj.ui diff --git a/src/.vscode/launch.json b/src/.vscode/launch.json new file mode 100644 index 0000000..86cd9ef --- /dev/null +++ b/src/.vscode/launch.json @@ -0,0 +1,23 @@ + +{ + "version": "0.2.0", + "configurations": [ + { + "name": "QtBuild", + "type": "cppdbg", + "request": "launch", + "program": "${command:cmake.launchTargetPath}", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceRoot}", + "environment": [ + { + "name": "PATH", + "value": "D:/qt/Qt5.14.2/5.14.2/mingw73_64/bin" + } + ], + "externalConsole": false, + "miDebuggerPath": "D:/qt/Qt5.14.2/5.14.2/mingw73_64/bin/gdb.exe" + } + ] +} \ No newline at end of file diff --git a/src/.vscode/settings.json b/src/.vscode/settings.json new file mode 100644 index 0000000..cb00389 --- /dev/null +++ b/src/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "qtConfigure.qtKitDir": "D:/qt/Qt5.14.2/5.14.2/mingw73_64" +} \ No newline at end of file diff --git a/src/AnalysTool.pro b/src/AnalysTool.pro index 1a30595..9cffb55 100644 --- a/src/AnalysTool.pro +++ b/src/AnalysTool.pro @@ -16,6 +16,7 @@ DEFINES += QT_DEPRECATED_WARNINGS #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ + data/filemanager.cpp \ global.cpp \ ui/centralwidget.cpp \ main.cpp \ @@ -28,6 +29,7 @@ SOURCES += \ ui/realtimedataform.cpp HEADERS += \ + data/filemanager.h \ defines.h \ global.h \ ui/centralwidget.h \ @@ -47,7 +49,8 @@ FORMS += \ INCLUDEPATH += serialport \ ui \ -thirdparty/qcustomplot +thirdparty/qcustomplot \ +data # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..c54ba15 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.5) # CMake install : https://cmake.org/download/ +project(qt_new_proj LANGUAGES CXX) +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_PREFIX_PATH "D:/qt/Qt5.14.2/5.14.2/mingw73_64") # Qt Kit Dir +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +find_package(Qt5 COMPONENTS Widgets REQUIRED) # Qt COMPONENTS +aux_source_directory(./src srcs) + +# Specify MSVC UTF-8 encoding +add_compile_options("$<$:/utf-8>") +add_compile_options("$<$:/utf-8>") + +add_executable(${PROJECT_NAME} + WIN32 # If you need a terminal for debug, please comment this statement + ${srcs} +) +target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets) # Qt5 Shared Library \ No newline at end of file diff --git a/src/data/filemanager.cpp b/src/data/filemanager.cpp new file mode 100644 index 0000000..3980a88 --- /dev/null +++ b/src/data/filemanager.cpp @@ -0,0 +1,55 @@ +#include +#include + +#include "filemanager.h" + + + +void FileManager::writeExperimentFile(const CommonData &cd, QFile &file) +{ + // double sampleTemp = cd.sample_temp; + // double dsc = cd.dsc; + + // write data to file + // QFile file("experiment_data.txt"); + // if (!file.open(QIODevice::Append | QIODevice::Text)) { + // qDebug() << "无法打开文件"; + // return; + // } + + QTextStream out(&file); + out.setRealNumberPrecision(3); // 设置精度为三位小数 + out.setFieldWidth(12); // 设置字段宽度,确保对齐 + out.setPadChar(' '); // 设置填充字符为空格 + + // 写入数据 + out << cd.sample_temp << ", " + << cd.dsc << endl; + + // 关闭文件 + file.close(); + +} + +void FileManager::createExperimentFile(const QString &fileName, QFile &file) +{ + // 使用传入的文件名创建QFile对象 + file.setFileName(fileName); + + // 尝试以写入文本模式打开文件,如果文件不存在则创建它 + if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { + qDebug() << "无法打开文件"; + } else { + qDebug() << "文件打开成功"; + } +} + +void FileManager::test() +{ + QString fileName = "experiment.txt"; + + QFile file; + createExperimentFile(fileName,file); + + +} diff --git a/src/data/filemanager.h b/src/data/filemanager.h new file mode 100644 index 0000000..e62fe75 --- /dev/null +++ b/src/data/filemanager.h @@ -0,0 +1,16 @@ +#ifndef FILE_MANAGER_H +#define FILE_MANAGER_H + +#include +#include + +#include "protocol.h" + +namespace FileManager{ +void createExperimentFile(const QString&,QFile &); +void writeExperimentFile(const CommonData&, QFile &); + +void test(); +}; + +#endif diff --git a/src/global.h b/src/global.h index 0742396..c66a32d 100644 --- a/src/global.h +++ b/src/global.h @@ -13,10 +13,11 @@ public: enum Mode{ Analysis, ConnectedToDev, - ExperimentStart + DeliveredData, + ExperimentStart, +// ExperimentStop = Analysis }; - void setMode(const Mode); Mode getMode(){return _mode;} @@ -29,6 +30,7 @@ public: void setDeviceConnectionStatus(const DeviceConnectionStatus); DeviceConnectionStatus getDeviceConnectionStatus(){return _deviceConnectStatus;} #endif + signals: void sigModeModify(const Mode); void sigDeviceConnnectionStatusModify(const DeviceConnectionStatus); diff --git a/src/main.cpp b/src/main.cpp index 9d12584..8e81c5a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,10 +1,9 @@ -#include "mainwindow.h" - #include +#include "mainwindow.h" #include "centralwidget.h" #include "serialport/serialport.h" -#include "ui/realtimedataform.h" +#include "realtimedataform.h" #include "experimentsettingform.h" int main(int argc, char *argv[]) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index a39a198..64345ac 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -19,7 +19,6 @@ MainWindow::MainWindow(QWidget *parent) setActionEnable(false); this->setToolTip("....."); - // resize(2222,1111); setCentralWidget(_centralWidget); addDockWidget(Qt::LeftDockWidgetArea, _leftWidget); @@ -43,14 +42,15 @@ MainWindow::~MainWindow() void MainWindow::connections() { //ui - connect(_expertmentSettingForm,&ExperimentSettingForm::sigConnectToDevice, - SerialPort::instance(),&SerialPort::slotConnectToDevice); - //dynamic data + connect(_expertmentSettingForm,&ExperimentSettingForm::sigDeliverData, + SerialPort::instance(),&SerialPort::slotDeliverData); #if 1 + //dynamic data connect(SerialPort::instance(),&SerialPort::sigSendCommonData, _centralWidget,&CentralWidget::slotRevCommonData); connect(SerialPort::instance(),&SerialPort::sigSendCommonData, _realTimeDataForm,&RealTimeDataForm::slotRevCommonData); + connect(SerialPort::instance(),&SerialPort::sigSendCommonDataToRealDataForm, _realTimeDataForm,&RealTimeDataForm::slotRevCommonData); #endif @@ -111,7 +111,7 @@ void MainWindow::on_actionRealTimeWidget_triggered() void MainWindow::on_actionConnectToDev_triggered() { if(SerialPort::instance()->openSp()){ - setActionEnable(true); + ui->actionNew->setEnabled(true); Global::instance()->setMode(Global::Mode::ConnectedToDev); }else{ QMessageBox::warning(this, "warnning", "Serial Port open failed."); diff --git a/src/serialport/serialport.cpp b/src/serialport/serialport.cpp index 3ad2462..ce41e92 100644 --- a/src/serialport/serialport.cpp +++ b/src/serialport/serialport.cpp @@ -101,23 +101,28 @@ void SerialPort::slotReadData() qDebug() << "receive info (hex):" << hexData; #endif - SerialPortProtocol *spp = (SerialPortProtocol*)ba.data(); - qDebug()<<"header:"<head,16).toUpper(); - if(FRANE_HEAD != spp->head){ - qDebug()<<"Data header error."; + SerialPortProtocol *spp = (SerialPortProtocol *)ba.data(); + // qDebug()<<"header:"<head,16).toUpper(); + if (FRANE_HEAD != spp->head) + { + qDebug() << "Data header error."; return; } - int length = spp->len - 5; + int dataLength = spp->len - 5; CommonData cd; - u8* cdPtr = (u8*)&cd; - memcpy(cdPtr + spp->addr,spp->data_buf,length); + u8 *cdPtr = (u8 *)&cd; + memcpy(cdPtr + spp->addr, spp->data_buf, dataLength); - if(WRITE_CMD == spp->cmd){ - writeCmdHandle(spp->len,spp->addr,cd); - }else{ - if(Global::Mode::ExperimentStart == Global::instance()->getMode()){ + if (WRITE_CMD == spp->cmd) + { + writeCmdHandle(dataLength, spp->addr, cd); + } + else + { + if (Global::Mode::ExperimentStart == Global::instance()->getMode()) + { emit sigSendCommonData(cd); } emit sigSendCommonDataToRealDataForm(cd); @@ -125,38 +130,81 @@ void SerialPort::slotReadData() #endif } -void SerialPort::writeCmdHandle(const int dataLength,const u16 addr,const CommonData&cd) +void SerialPort::writeCmdHandle(const int dataLength, const u16 addr, + const CommonData &cd) { -#if 0 - SerialPortProtocol spp; - memcpy(&spp,ba.data(),ba.size()); -#endif + int localLength = dataLength; + int localAddr = addr; -// SerialPortProtocol *spp = (SerialPortProtocol *)ba.data(); -// int length = spp->len - 5; + int phaseByteSize = sizeof(Phase); + auto phaseParserFunc = [&](const int index){ + Phase phase; + phase.onoff = 1; + phase.gas = cd.phase_data[index].gas; + phase.temp_flow = cd.phase_data[index].temp_flow; + phase.cutoff_temp = cd.phase_data[index].cutoff_temp; + phase.constant_temp_time_min = + cd.phase_data[index].constant_temp_time_min; -// CommonData cd; -// u8* cdPtr = (u8*)&cd; + localLength -= phaseByteSize; + localAddr += phaseByteSize; + }; -// memcpy(cdPtr + spp->addr,spp->data_buf,length); - - qDebug()<<"revDataParser run_type:"<temp, msg_data.current_gas); + localAddr += 1; + localLength -= 1; break; + case offsetof(CommonData, auto_pid_temp_flow): //自整定升温速率 + localAddr += 4; + localLength -= 4; + break; + case offsetof(CommonData, run_mode): + { + DeviceStartMode mode = (DeviceStartMode)cd.run_mode; + + switch (mode) + { + case DeviceStartMode::Stop: + Global::instance()->setMode(Global::Mode::Analysis); + break; + case DeviceStartMode::Start: + Global::instance()->setMode(Global::Mode::ExperimentStart); + break; + default: + break; + } + // + localLength--; + localAddr++; + + break; + } + case offsetof(CommonData, phase_data[0].onoff): + phaseParserFunc(0); break; + case offsetof(CommonData, phase_data[1].onoff): + phaseParserFunc(1); break; + case offsetof(CommonData, phase_data[2].onoff): + phaseParserFunc(2); break; + case offsetof(CommonData, phase_data[3].onoff): + phaseParserFunc(3); break; + case offsetof(CommonData, phase_data[4].onoff): + phaseParserFunc(4); break; + case offsetof(CommonData, phase_data[5].onoff): + phaseParserFunc(5); break; + default:break; }; } } bool SerialPort::openSp() { - if(_sp != nullptr && _sp->isOpen()){ + if (_sp != nullptr && _sp->isOpen()) + { return true; } @@ -205,7 +253,6 @@ bool SerialPort::openSp() return true; } - void SerialPort::sendCmd(const SerialPort::E_CMD_TYPE e) { #if 1 @@ -347,7 +394,7 @@ void SerialPort::parserTest() #endif } -void SerialPort::slotConnectToDevice(const QByteArray &ba) +void SerialPort::slotDeliverData(const QByteArray &ba) { openSp(); @@ -356,12 +403,22 @@ void SerialPort::slotConnectToDevice(const QByteArray &ba) void SerialPort::slotSendData(const QByteArray &ba) { + /*** + * 写入的数据有 + * 1、阶段设置。 + */ + if(WRITE_CMD == ba.at(3)){ + _lastWriteBa = ba; + } qDebug() << "slotSendData:" << ba.size(); - if(_sp != nullptr && _sp->isOpen()){ + if (_sp != nullptr && _sp->isOpen()) + { _sp->write(ba); - }else{ - qDebug()<<"sp not open."; + } + else + { + qDebug() << "sp not open."; // qErrnoWarning("sp not open."); return; } @@ -369,7 +426,8 @@ void SerialPort::slotSendData(const QByteArray &ba) void SerialPort::slotCloseSp() { - if(_sp != nullptr && _sp->isOpen()){ + if (_sp != nullptr && _sp->isOpen()) + { _sp->close(); } } diff --git a/src/serialport/serialport.h b/src/serialport/serialport.h index dfeded9..9d06c4e 100644 --- a/src/serialport/serialport.h +++ b/src/serialport/serialport.h @@ -25,7 +25,8 @@ public: static void parserTest(); bool openSp(); public slots: - void slotConnectToDevice(const QByteArray&); + void slotDeliverData(const QByteArray&); +// void slotConnectToDevice(const QByteArray&); void slotSendData(const QByteArray&); void slotCloseSp(); signals: @@ -42,6 +43,7 @@ private: private: SerialPort(QObject* parent=nullptr); QSerialPort *_sp; + QByteArray _lastWriteBa; }; #endif // SERIALPORT_H diff --git a/src/src/main.cpp b/src/src/main.cpp new file mode 100644 index 0000000..10481e3 --- /dev/null +++ b/src/src/main.cpp @@ -0,0 +1,12 @@ +#include "qt_new_proj.h" + +#include +#pragma comment(lib, "user32.lib") + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + qt_new_proj w; + w.show(); + return a.exec(); +} \ No newline at end of file diff --git a/src/src/qt_new_proj.cpp b/src/src/qt_new_proj.cpp new file mode 100644 index 0000000..dc33ef8 --- /dev/null +++ b/src/src/qt_new_proj.cpp @@ -0,0 +1,13 @@ +#include "qt_new_proj.h" + +qt_new_proj::qt_new_proj(QWidget* parent) + : QMainWindow(parent) + , ui(new Ui_qt_new_proj) +{ + ui->setupUi(this); +} + +qt_new_proj::~qt_new_proj() +{ + delete ui; +} \ No newline at end of file diff --git a/src/src/qt_new_proj.h b/src/src/qt_new_proj.h new file mode 100644 index 0000000..9b7e3de --- /dev/null +++ b/src/src/qt_new_proj.h @@ -0,0 +1,14 @@ +#pragma once +#include "ui_qt_new_proj.h" +#include + +class qt_new_proj : public QMainWindow { + Q_OBJECT + +public: + qt_new_proj(QWidget* parent = nullptr); + ~qt_new_proj(); + +private: + Ui_qt_new_proj* ui; +}; \ No newline at end of file diff --git a/src/src/qt_new_proj.ui b/src/src/qt_new_proj.ui new file mode 100644 index 0000000..ef76f54 --- /dev/null +++ b/src/src/qt_new_proj.ui @@ -0,0 +1,22 @@ + + + qt_new_proj + + + + 0 + 0 + 800 + 600 + + + + qt_new_proj + + + + + + + + \ No newline at end of file diff --git a/src/ui/centralwidget.cpp b/src/ui/centralwidget.cpp index 5a3d3a7..b92580a 100644 --- a/src/ui/centralwidget.cpp +++ b/src/ui/centralwidget.cpp @@ -55,6 +55,7 @@ void CentralWidget::slotModeModify(const Global::Mode mode) void CentralWidget::slotRevCommonData(const CommonData &cd) { + qDebug()<<"slotRevCommonData"; _customPlot->graph(0)->addData(cd.sample_temp, cd.dsc); // 添加数据到曲线 _customPlot->replot(); } diff --git a/src/ui/experimentsettingform.cpp b/src/ui/experimentsettingform.cpp index 064df31..4f04729 100644 --- a/src/ui/experimentsettingform.cpp +++ b/src/ui/experimentsettingform.cpp @@ -166,9 +166,9 @@ void ExperimentSettingForm::slotConnectToDevice() QByteArray ba = DataParser::connectToDevice(phaseVtr); qDebug()<<"ba size:"<setMode(Global::Mode::ConnectedToDev); +// Global::instance()->setMode(Global::Mode::ConnectedToDev); #if 0 QByteArray startBa = DataParser::setDeviceStartStop(DeviceStartMode::Start); @@ -223,7 +223,7 @@ void ExperimentSettingForm::slotPhaseCheck() } } -void ExperimentSettingForm::on_pushButton_connect_to_device_clicked() +void ExperimentSettingForm::on_pushButton_deliverData_clicked() { slotConnectToDevice(); } diff --git a/src/ui/experimentsettingform.h b/src/ui/experimentsettingform.h index 34d2c8b..f2f47e0 100644 --- a/src/ui/experimentsettingform.h +++ b/src/ui/experimentsettingform.h @@ -16,9 +16,9 @@ public: ~ExperimentSettingForm(); signals: - void sigConnectToDevice(const QByteArray&); + void sigDeliverData(const QByteArray&); private slots: - void on_pushButton_connect_to_device_clicked(); + void on_pushButton_deliverData_clicked(); private: void uiReset(); diff --git a/src/ui/experimentsettingform.ui b/src/ui/experimentsettingform.ui index 91b3e0a..8237f08 100644 --- a/src/ui/experimentsettingform.ui +++ b/src/ui/experimentsettingform.ui @@ -460,7 +460,7 @@ - + 471 @@ -470,7 +470,7 @@ - 连接仪器 + 下发数据