2025-03-14T16:58:07

This commit is contained in:
yuntang 2025-03-14 16:58:08 +08:00
parent d1c95336e1
commit 859dde6b50
9 changed files with 216 additions and 94 deletions

View File

@ -23,8 +23,16 @@ MainWindow::MainWindow(QWidget *parent)
setCentralWidget(_centralWidget);
addDockWidget(Qt::LeftDockWidgetArea, _leftWidget);
//
ui->statusbar->showMessage("showMessage show temp message!");
// permenent show
QLabel *permenentLabel = new QLabel(this);
permenentLabel->setText("Permanent show!");
ui->statusbar->addPermanentWidget(permenentLabel);
//
connections();
//
_realTimeDataForm->show();
}
MainWindow::~MainWindow()
@ -38,8 +46,15 @@ void MainWindow::connections()
connect(_expertmentSettingForm,&ExperimentSettingForm::sigConnectToDevice,
SerialPort::instance(),&SerialPort::slotConnectToDevice);
//dynamic data
#if 1
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
//mode
connect(Global::instance(),&Global::sigModeModify,
_centralWidget,&CentralWidget::slotModeModify);
@ -64,7 +79,7 @@ void MainWindow::on_actionStop_triggered()
{
QByteArray ba = DataParser::setDeviceStartStop(DeviceStartMode::Stop);
SerialPort::instance()->slotSendData(ba);
SerialPort::instance()->slotCloseSp();
// SerialPort::instance()->slotCloseSp();
}
void MainWindow::on_actionNew_triggered()
@ -75,6 +90,10 @@ void MainWindow::on_actionNew_triggered()
void MainWindow::on_actionStart_triggered()
{
QByteArray ba = DataParser::setDeviceStartStop(DeviceStartMode::Start);
QString hexData = ba.toHex(' '); // ' ' 作为分隔符,可选参数
qDebug() << "on_actionStart_triggered info (hex):" << hexData;
SerialPort::instance()->slotSendData(ba);
}

View File

@ -2,11 +2,13 @@
#define MAINWINDOW_H
#include <QMainWindow>
#include <QStatusBar>
#include "centralwidget.h"
#include "leftwidget.h"
#include "experimentsettingform.h"
#include "realtimedataform.h"
#include "dataparser.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
@ -35,5 +37,6 @@ private:
LeftWidget*_leftWidget;
ExperimentSettingForm *_expertmentSettingForm;
RealTimeDataForm* _realTimeDataForm;
QStatusBar *_statusBar;
};
#endif // MAINWINDOW_H

View File

@ -1,12 +1,11 @@
#include <QDebug>
#include <QDataStream>
#include <stddef.h>
#include "dataparser.h"
#include "defines.h"
#include "global.h"
DataParser::DataParser()
{
}
bool DataParser::commonDataParser(const QByteArray &ba, CommonData &cd)
{
@ -17,7 +16,6 @@ bool DataParser::commonDataParser(const QByteArray &ba, CommonData &cd)
static_cast<unsigned char>(charArray[1]) == 0x5A)
{
// std::cout << "前两个字节是 0x5AA5 (小端)" << std::endl;
}
else
{
@ -37,6 +35,41 @@ bool DataParser::commonDataParser(const QByteArray &ba, CommonData &cd)
return true;
}
#if 0
bool DataParser::slotDataParser(const QByteArray &ba)
{
#if 0
SerialPortProtocol spp;
memcpy(&spp,ba.data(),ba.size());
#endif
SerialPortProtocol *spp = (SerialPortProtocol *)ba.data();
int length = spp->len - 5;
CommonData cd;
u8* cdPtr = (u8*)&cd;
memcpy(cdPtr + spp->addr,spp->data_buf,length);
qDebug()<<"revDataParser run_type:"<<cd.run_mode;
while(length){
switch(spp->addr){
case offsetof(CommonData,run_mode):
Global::Mode mode = (Global::Mode)cd.run_mode;
length--;
break;
};
}
}
#endif
void DataParser::writeData(const QByteArray &)
{
}
QByteArray DataParser::connectToDevice(const QVector<Phase> &vtr)
{
const int phaseLength = sizeof(Phase);
@ -90,6 +123,24 @@ QByteArray DataParser::connectToDevice(const QVector<Phase> &vtr)
QByteArray DataParser::setDeviceStartStop(const DeviceStartMode mode)
{
#if 1
SerialPortProtocol spp;
spp.head = FRANE_HEAD;
spp.len = 1 + 2 + 1 + 2;
spp.cmd = WRITE_CMD;
spp.addr = 0x002c;
spp.data_buf[0] = mode;
int sppValidLength = 6 + 1;
u8 *dataPtr = (u8*)&spp;
u16 crc = modbusCRC16((u8*)(dataPtr + 3),4);
return QByteArray((char*)&spp,sppValidLength) +
QByteArray((char*)&crc,2);
#endif
#if 0
char data[300] = {};
// header
u16 header = 0x5aa5;
@ -114,6 +165,7 @@ QByteArray DataParser::setDeviceStartStop(const DeviceStartMode mode)
int length = 9;
return QByteArray(data,length);
#endif
}
unsigned short DataParser::modbusCRC16(unsigned char *data, unsigned short length)

View File

@ -3,20 +3,45 @@
#include <QVector>
#include <qbytearray.h>
#include <qobject.h>
#include "protocol.h"
#include "defines.h"
namespace DataParser {
QByteArray connectToDevice(const QVector<Phase>&);
QByteArray setDeviceStartStop(const DeviceStartMode);
bool commonDataParser(const QByteArray&ba,CommonData &cd);
void writeData(const QByteArray&);
unsigned short modbusCRC16(unsigned char *data,unsigned short length);
}
#if 0
class DataParser
{
public:
DataParser();
void dataParser(const QByteArray& ba);
static unsigned short modbusCRC16(unsigned char *data,unsigned short length);
static QByteArray connectToDevice(const QVector<Phase>&);
static QByteArray setDeviceStartStop(const DeviceStartMode);
static bool commonDataParser(const QByteArray&ba,CommonData &cd);
bool revDataParser(const QByteArray&ba);
#if 0
public slots:
void slotDataParser(const QByteArray& ba);
signals:
void sigSendCommonData(const CommonData&);
void sigSendCommonDataToRealDataForm(const CommonData&);
#endif
private:
void writeData(const QByteArray&);
void readData(const QByteArray&);
};
#endif
#endif // DATAPARSER_H

View File

@ -17,14 +17,14 @@ enum DeviceStartMode{
StopAutoTune // 停止升温速率自整定
};
struct com_protocol
typedef struct com_protocol
{
uint16_t head;
uint8_t len;
uint8_t cmd;
uint16_t addr;
uint8_t data_buf[256];
};
}SerialPortProtocol;
typedef enum gas_type {
NC,

View File

@ -93,53 +93,67 @@ void SerialPort::timerEvent(QTimerEvent *event)
void SerialPort::slotReadData()
{
#if 1
QByteArray ba = _sp->readAll();
#if 0
// 将 QByteArray 转换为十六进制字符串
QString hexData = ba.toHex(' '); // ' ' 作为分隔符,可选参数
qDebug() << "receive info (hex):" << hexData;
#endif
SerialPortProtocol *spp = (SerialPortProtocol*)ba.data();
qDebug()<<"header:"<<QString::number(spp->head,16).toUpper();
if(FRANE_HEAD != spp->head){
qDebug()<<"Data header error.";
return;
}
int length = spp->len - 5;
CommonData cd;
if (!DataParser::commonDataParser(ba, cd))
{
qDebug() << "CommonData parse failed.";
u8* cdPtr = (u8*)&cd;
memcpy(cdPtr + spp->addr,spp->data_buf,length);
if(WRITE_CMD == spp->cmd){
writeCmdHandle(spp->len,spp->addr,cd);
}else{
if(Global::Mode::ExperimentStart == Global::instance()->getMode()){
emit sigSendCommonData(cd);
}
emit sigSendCommonDataToRealDataForm(cd);
}
// 格式化输出 float 类型,保留两位小数
QString formattedRunTime = QString::number(cd.add_run_time, 'f', 2);
qDebug() << "run time:" << formattedRunTime;
qDebug()<<"phase:"<<QString::number(cd.current_phase);
qDebug()<<"dsc:"<<QString::number(cd.dsc,'f',3);
// 格式化输出 double 类型,保留三位小数
QString formattedSampleTemp = QString::number(cd.sample_temp, 'f', 3);
qDebug() << "sample temp:" << formattedSampleTemp;
QString formattedColdTemp = QString::number(cd.cold_temp, 'f', 3);
qDebug() << "cold temp:" << formattedColdTemp;
if(Global::Mode::ExperimentStart == Global::instance()->getMode()){
emit sigSendCommonData(cd);
}
#if 0
CommonData *serialPortData =
reinterpret_cast<CommonData*>(const_cast<char*>(&data.data()[6]));
// 格式化输出 double 类型,保留三位小数
QString formattedSampleTemp = QString::number(serialPortData->sample_temp, 'f', 3);
qDebug() << "sample temp:" << formattedSampleTemp;
QString formattedColdTemp = QString::number(serialPortData->cold_temp, 'f', 3);
qDebug() << "cold temp:" << formattedColdTemp;
emit sigSendSerialPortData(*serialPortData);
#endif
}
void SerialPort::writeCmdHandle(const int dataLength,const u16 addr,const CommonData&cd)
{
#if 0
SerialPortProtocol spp;
memcpy(&spp,ba.data(),ba.size());
#endif
// SerialPortProtocol *spp = (SerialPortProtocol *)ba.data();
// int length = spp->len - 5;
// CommonData cd;
// u8* cdPtr = (u8*)&cd;
// memcpy(cdPtr + spp->addr,spp->data_buf,length);
qDebug()<<"revDataParser run_type:"<<cd.run_mode;
int length = dataLength;
while(dataLength){
switch(addr){
case offsetof(CommonData,run_mode):
// Global::Mode mode = (Global::Mode)cd.run_mode;
length--;
break;
};
}
}
bool SerialPort::openSp()
{
if(_sp != nullptr && _sp->isOpen()){
@ -351,29 +365,6 @@ void SerialPort::slotSendData(const QByteArray &ba)
// qErrnoWarning("sp not open.");
return;
}
#if 0
// 将 QByteArray 转换为十六进制字符串
QString hexData = ba.toHex(' '); // ' ' 作为分隔符,可选参数
qDebug() << "send info (hex):" << hexData;
#endif
CommonData cd;
if (!DataParser::commonDataParser(ba, cd))
{
qDebug() << "CommonData parse failed.";
}
// 格式化输出 float 类型,保留两位小数
QString formattedRunTime = QString::number(cd.add_run_time, 'f', 2);
qDebug() << "run time:" << formattedRunTime;
// 格式化输出 double 类型,保留三位小数
QString formattedSampleTemp = QString::number(cd.sample_temp, 'f', 3);
qDebug() << "sample temp:" << formattedSampleTemp;
QString formattedColdTemp = QString::number(cd.cold_temp, 'f', 3);
qDebug() << "cold temp:" << formattedColdTemp;
}
void SerialPort::slotCloseSp()

View File

@ -5,6 +5,7 @@
#include <QSerialPort>
#include <QSerialPortInfo>
#include "defines.h"
#include "protocol.h"
class SerialPort:public QObject
@ -28,13 +29,14 @@ public slots:
void slotSendData(const QByteArray&);
void slotCloseSp();
signals:
// void sigSendSerialPortData(const CommonData&);
void sigSendCommonData(const CommonData&);
void sigSendCommonDataToRealDataForm(const CommonData&);
protected:
void timerEvent(QTimerEvent *event);
private slots:
void slotReadData();
private:
void writeCmdHandle(const int dataLength,const u16 addr,const CommonData&cd);
void to_hex(char* in_char, int char_length, char* out_char);
void displayPortInfo();
private:

View File

@ -2,12 +2,10 @@
#include "realtimedataform.h"
#include "ui_realtimedataform.h"
RealTimeDataForm::RealTimeDataForm(QWidget *parent) :
QWidget(parent),
ui(new Ui::RealTimeDataForm)
RealTimeDataForm::RealTimeDataForm(QWidget *parent) : QWidget(parent),
ui(new Ui::RealTimeDataForm)
{
ui->setupUi(this);
}
RealTimeDataForm::~RealTimeDataForm()
@ -15,7 +13,7 @@ RealTimeDataForm::~RealTimeDataForm()
delete ui;
}
void RealTimeDataForm::slotRevSerialPortData(const CommonData & data)
void RealTimeDataForm::slotRevCommonData(const CommonData &data)
{
#if 0
qDebug()<<"rev-------------------------";
@ -26,7 +24,7 @@ void RealTimeDataForm::slotRevSerialPortData(const CommonData & data)
QString formattedColdTemp = QString::number(data.cold_temp, 'f', 3);
qDebug() << "cold temp:" << formattedColdTemp;
#endif
//异常信息
// 异常信息
/**
* @brief abnormalStr
* 0
@ -36,39 +34,71 @@ void RealTimeDataForm::slotRevSerialPortData(const CommonData & data)
4
*/
QString abnormalStr = "空闲状态";
QString abnormalStr = "正常";
switch (data.hardware_err) {
case 0:abnormalStr = "空闲状态";
switch (data.hardware_err)
{
case 0:
abnormalStr = "正常";
break;
case 1:abnormalStr = "加热运行";
case 1:
abnormalStr = "冷端温度错误";
break;
case 2:abnormalStr = "恒温运行";
case 2:
abnormalStr = "采集板卡错误";
break;
case 3:abnormalStr = "冷却中";
case 3:
abnormalStr = "样品温度错误";
break;
case 4:
abnormalStr = "DSC错误";
break;
case 5:
abnormalStr = "加热模块错误";
break;
default:
break;
case 4:abnormalStr = "升温速率自整定";break;
default:break;
}
ui->abnormalLineEdit->setText(abnormalStr);
//运行状态
ui->runStatusLineEdit->setText(QString::number(data.run_type));
//当前阶段
// 运行状态
QString runTypeStr = "空闲状态";
switch (data.run_type)
{
case 0:
runTypeStr = "空闲状态";
break;
case 1:
runTypeStr = "加热运行";
break;
case 2:
runTypeStr = "恒温运行";
break;
case 3:
runTypeStr = "冷却中";
break;
case 4:
runTypeStr = "升温速率自整定";
break;
default:
break;
}
ui->runStatusLineEdit->setText(runTypeStr);
// 当前阶段
ui->currentStageLineEdit->setText(QString::number(data.current_phase));
//累计运行时间
// 累计运行时间
ui->addruntimeLineEdit->setText(QString::number(data.add_run_time, 'f', 3));
//恒温时间
// 恒温时间
ui->constantTempTimeLineEdit->setText(QString::number(data.add_constan_temp_time, 'f', 3));
//温度
// 温度
ui->tempLineEdit->setText(QString::number(data.sample_temp, 'f', 3));
//DSC
// DSC
ui->dSCMwLineEdit->setText(QString::number(data.dsc, 'f', 3));
//样品质量
// 样品质量
ui->weightLineEdit->setText("--");
//通氧时间
// 通氧时间
ui->oxyTimeLineEdit->setText("--");
//扫描速率
// 扫描速率
ui->scanRateLineEdit->setText("--");
//当前气氛
// 当前气氛
ui->currentAtmosphereLineEdit->setText(QString::number(data.current_gas));
}

View File

@ -17,7 +17,7 @@ public:
explicit RealTimeDataForm(QWidget *parent = nullptr);
~RealTimeDataForm();
public:
void slotRevSerialPortData(const CommonData&);
void slotRevCommonData(const CommonData&);
private:
Ui::RealTimeDataForm *ui;
};