2025-03-14T16:58:07
This commit is contained in:
parent
d1c95336e1
commit
859dde6b50
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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()
|
||||
|
@ -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:
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -17,7 +17,7 @@ public:
|
||||
explicit RealTimeDataForm(QWidget *parent = nullptr);
|
||||
~RealTimeDataForm();
|
||||
public:
|
||||
void slotRevSerialPortData(const CommonData&);
|
||||
void slotRevCommonData(const CommonData&);
|
||||
private:
|
||||
Ui::RealTimeDataForm *ui;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user