DSCAnalysisTool/YT_TANGOUS_Release/serialworker.cpp

552 lines
22 KiB
C++
Raw Normal View History

2025-03-06 07:25:37 +00:00
#include "serialworker.h"
#include "thermalwidget.h"
#include <QApplication>
#include <QtWidgets/QMessageBox>
#include <cstring>
QVector<float> g_qvecf_time;
QVector<float> g_qvecf_cur_time;
QVector<double> g_qvecd_temper;
QVector<double> g_qvecd_dsc;
QVector<double> g_qvecd_riserate;
QVector<float> g_qvecf_cooltemper;
int g_send_flag;
QVector<double> g_real_temper;
QVector<double> g_real_dsc;
extern QuadraticFitResult g_result1;
SerialWorker::SerialWorker(QObject *parent) : QObject(parent)
{
m_recBuf.clear();
port = new QSerialPort(this);
m_bOpen = false;
g_send_flag = 0;
m_write_flag = 0;
m_read_flag = 0;
///init_port();
connect(port, SIGNAL(readyRead()), this, SLOT(handle_data()), Qt::QueuedConnection); //Qt::DirectConnection
}
SerialWorker::~SerialWorker()
{
port->close();
port->deleteLater();
}
void SerialWorker::init_port(QString comName)
{
m_comName = comName;
port->setPortName(comName); //串口名
port->setBaudRate(115200); //波特率
port->setDataBits(QSerialPort::Data8); //数据位
port->setStopBits(QSerialPort::OneStop); //停止位
port->setParity(QSerialPort::NoParity); //奇偶校验
port->setFlowControl(QSerialPort::NoFlowControl); //流控制
qDebug() << "Port init ok "<<comName<<Qt::endl;
}
void SerialWorker::open_serial_port()
{
// port->setPortName(m_comName); //串口名
// port->setBaudRate(115200); //波特率
// port->setDataBits(QSerialPort::Data8); //数据位
// port->setStopBits(QSerialPort::OneStop); //停止位
// port->setParity(QSerialPort::NoParity); //奇偶校验
// port->setFlowControl(QSerialPort::NoFlowControl); //流控制
if (port->open(QIODevice::ReadWrite))
{
qDebug() << "Port have been opened";
emit show_success_msgbox();
m_bOpen = true;
port->setDataTerminalReady(true);
}
else
{
qDebug() << "open COM failed";
emit show_failed_msgbox();
}
qDebug() << "init_port thread is:" << QThread::currentThreadId();
}
void SerialWorker::close_serial_port()
{
if(m_bOpen==true)
{
port->close();
emit close_serial_port_success();
m_bOpen = false;
}
}
void SerialWorker::change_send_flag()
{
///m_send_flag = 1;
}
void SerialWorker::change_test_start_flag_slot()
{
m_test_start_flag = 1;
}
void SerialWorker::handle_data()
{
int valid_data=0;
int valid_len=0;
uint16_t crcrec = 0;
unsigned char* objBuf= NULL;
unsigned char* validBuf = NULL;
unsigned char* crcdataBuf=NULL;
unsigned char* dealBuf= NULL;
unsigned char* sendBuf= NULL;
QByteArray recBuf= port->readAll();
///m_recBuf.append(recBuf);
emit receive_data(recBuf);
int lenbuf = recBuf.size(); //总数据长度
objBuf = (unsigned char*)std::malloc(lenbuf);
std::memcpy(objBuf, (unsigned char*)recBuf.data(), lenbuf);
for(int i=0; i<(lenbuf-1); i++)
{
if((objBuf[i]==0xA5)&&(objBuf[i+1]==0x5A))
{
valid_data = i;
///qDebug() << "in for i = "<< i <<Qt::endl;
///m_framecount++;
break;
}
}
valid_len = lenbuf-valid_data; //有效数据长度,去掉前面的无效数据
validBuf = (unsigned char*)std::malloc(valid_len);
std::memcpy(validBuf, objBuf, valid_len);
if((validBuf[0]==0xA5)&&(validBuf[1]==0x5A)) //开始解析
{
m_whole_len = validBuf[2]; //全数据长度
m_data_len = m_whole_len - 3; //载荷数据长度
if(validBuf[3]==0x82) //写指令
m_write_flag = 1;
if (validBuf[3]==0x83) //读指令
m_read_flag = 1;
crcdataBuf = (unsigned char*)std::malloc((m_data_len+1)); //CRC校验
std::memcpy(crcdataBuf, validBuf+3, (m_data_len+1));
///int len = sizeof(crcdataBuf); //错误
int len = m_data_len+1;
uint16_t crcret = CRC16_MODBUS(crcdataBuf, len);
crcrec = (validBuf[m_whole_len+2]<<8)|(validBuf[m_whole_len+1]); //获得的CRC值高位在后低位在前
if(crcret==crcrec)
{
m_crc_flag = 1;
qDebug("crc check right!");
}else
{
m_crc_flag = 0;
qDebug("crc check wrong!");
}
std::free(crcdataBuf);
crcdataBuf = NULL;
//0,运行状态
//1,当前阶段
//26,硬件错误
//27,当前气氛
if(1==m_crc_flag)
{
if((1==m_read_flag)&&(0==g_send_flag))
{
if(validBuf[4] == char(0x00))
{
qDebug("start parse data!");
m_run_state_continue = validBuf[6]; //0运行状态
data_t.x[0] = validBuf[8]; //2累计运行时间
data_t.x[1] = validBuf[9];
data_t.x[2] = validBuf[10];
data_t.x[3] = validBuf[11];
///g_qvecf_time.append(data_t.f);
data_curaccum_t.x[0] = validBuf[12]; //6当前阶段恒温时间
data_curaccum_t.x[1] = validBuf[13];
data_curaccum_t.x[2] = validBuf[14];
data_curaccum_t.x[3] = validBuf[15];
// g_qvecf_cur_time.append(data_curaccum_t.f);
data_temper.x[0] = validBuf[16]; //A样品温度
data_temper.x[1] = validBuf[17];
data_temper.x[2] = validBuf[18];
data_temper.x[3] = validBuf[19];
data_temper.x[4] = validBuf[20];
data_temper.x[5] = validBuf[21];
data_temper.x[6] = validBuf[22];
data_temper.x[7] = validBuf[23];
// g_qvecd_temper.append(data_temper.d);
// mutex.lock();
// g_real_temper.append(data_temper.d);
// mutex.unlock();
data_dsc.x[0] = validBuf[24]; //12热流
data_dsc.x[1] = validBuf[25];
data_dsc.x[2] = validBuf[26];
data_dsc.x[3] = validBuf[27];
data_dsc.x[4] = validBuf[28];
data_dsc.x[5] = validBuf[29];
data_dsc.x[6] = validBuf[30];
data_dsc.x[7] = validBuf[31];
// g_qvecd_dsc.append(data_dsc.d);
// mutex.lock();
// g_real_dsc.append(data_dsc.d);
// mutex.unlock();
data_riserate.x[0] = validBuf[32]; //1A升温速率
data_riserate.x[1] = validBuf[33];
data_riserate.x[2] = validBuf[34];
data_riserate.x[3] = validBuf[35];
data_riserate.x[4] = validBuf[36];
data_riserate.x[5] = validBuf[37];
data_riserate.x[6] = validBuf[38];
data_riserate.x[7] = validBuf[39];
// g_qvecd_riserate.append(data_riserate.d);
data_cooltemper.x[0] = validBuf[40]; //22冷端温度
data_cooltemper.x[1] = validBuf[41];
data_cooltemper.x[2] = validBuf[42];
data_cooltemper.x[3] = validBuf[43];
// g_qvecf_cooltemper.append(data_cooltemper.f);
///m_qmap_fd.insert(data_t.f, data_dsc.d);
if(m_run_state_continue==char(0x01))
{
mutex.lock();
g_qvecf_time.append(data_t.f);
g_qvecf_cur_time.append(data_curaccum_t.f);
g_qvecd_temper.append(data_temper.d);
g_qvecd_dsc.append(data_dsc.d);
g_qvecd_riserate.append(data_riserate.d);
g_qvecf_cooltemper.append(data_cooltemper.f);
g_real_temper.append(data_temper.d);
g_real_dsc.append(data_dsc.d);
mutex.unlock();
qDebug()<<"m_run_state_continue check ok"<<Qt::endl;
}
if(1 == m_test_start_flag)
{
mutex.lock();
m_test_start_flag = 0;
g_qvecf_time.clear();
g_qvecf_cur_time.clear();
g_qvecd_temper.clear();
g_qvecd_dsc.clear();
g_qvecd_riserate.clear();
g_qvecf_cooltemper.clear();
g_real_temper.clear();
g_real_dsc.clear();
mutex.unlock();
}
qDebug()<<"run_state_continue="<<(int)m_run_state_continue<<"time="<<data_t.f<<"current_acc_time="<<data_curaccum_t.f<< "temper=" << data_temper.d <<"DSC="
<< data_dsc.d<< "riserate="<<data_riserate.d <<"cooltemper="<< data_cooltemper.f <<Qt::endl;
}
}
if((1==m_read_flag)&&(1==g_send_flag)&&(0==m_write_flag))
{
g_send_flag = 0;
m_read_flag = 0;
int readback_len = 0;
int lebuf = m_dealSendBytes.size(); //总数据长度
sendBuf = (unsigned char*)std::malloc(lebuf);
std::memcpy(sendBuf, (unsigned char*)m_dealSendBytes.data(), lebuf);
if(validBuf[4] == sendBuf[4])
{
readback_len = validBuf[2]-5;
if(validBuf[4] == 0x00)
{
m_run_state = validBuf[6];
emit show_run_state_box_state(m_run_state);
qDebug()<<"read addr 0x00 success!"<<Qt::endl;
}
if(validBuf[4] == 0x2C)
{
unsigned char mode_state = validBuf[6];
emit show_checkbox_state(mode_state);
qDebug()<<"read addr 0x2C success!"<<Qt::endl;
}
if(validBuf[4] == 0x50)
{
m_stage1_state = validBuf[6];
stage1_until.x[0] = validBuf[7];
stage1_until.x[1] = validBuf[8];
stage1_until.x[2] = validBuf[9];
stage1_until.x[3] = validBuf[10];
stage1_riserate.x[0] = validBuf[11];
stage1_riserate.x[1] = validBuf[12];
stage1_riserate.x[2] = validBuf[13];
stage1_riserate.x[3] = validBuf[14];
m_stage1_time = (validBuf[15]<<8)|validBuf[16];
m_stage1_airchoose = validBuf[17];
emit set_stage1_edit_box(m_stage1_state, stage1_until.f, stage1_riserate.f, m_stage1_time, m_stage1_airchoose);
qDebug()<<"read addr 0x50 success!"<<"m_stage1_state"<<m_stage1_state<<"stage1_until"
<<stage1_until.f<<"stage1_riserate"<<stage1_riserate.f<<"m_stage1_time"<<m_stage1_time<<"m_stage1_airchoose"<<m_stage1_airchoose<<Qt::endl;
}
if(validBuf[4] == 0x5c)
{
m_stage2_state = validBuf[6];
stage2_until.x[0] = validBuf[7];
stage2_until.x[1] = validBuf[8];
stage2_until.x[2] = validBuf[9];
stage2_until.x[3] = validBuf[10];
stage2_riserate.x[0] = validBuf[11];
stage2_riserate.x[1] = validBuf[12];
stage2_riserate.x[2] = validBuf[13];
stage2_riserate.x[3] = validBuf[14];
m_stage2_time = (validBuf[15]<<8)|validBuf[16];
m_stage2_airchoose = validBuf[17];
emit set_stage2_edit_box(m_stage2_state, stage2_until.f, stage2_riserate.f, m_stage2_time, m_stage2_airchoose);
qDebug()<<"read addr 0x5C success!"<<"m_stage2_state"<<m_stage2_state<<"stage2_until"
<<stage2_until.f<<"stage2_riserate"<<stage2_riserate.f<<"m_stage2_time"<<m_stage2_time<<"m_stage2_airchoose"<<m_stage2_airchoose<<Qt::endl;
}
if(validBuf[4] == 0x68)
{
m_stage3_state = validBuf[6];
stage3_until.x[0] = validBuf[7];
stage3_until.x[1] = validBuf[8];
stage3_until.x[2] = validBuf[9];
stage3_until.x[3] = validBuf[10];
stage3_riserate.x[0] = validBuf[11];
stage3_riserate.x[1] = validBuf[12];
stage3_riserate.x[2] = validBuf[13];
stage3_riserate.x[3] = validBuf[14];
m_stage3_time = (validBuf[15]<<8)|validBuf[16];
m_stage3_airchoose = validBuf[17];
emit set_stage3_edit_box(m_stage3_state, stage3_until.f, stage3_riserate.f, m_stage3_time, m_stage3_airchoose);
qDebug()<<"read addr 0x68 success!"<<"m_stage3_state"<<m_stage3_state<<"stage3_until"
<<stage3_until.f<<"stage3_riserate"<<stage3_riserate.f<<"m_stage3_time"<<m_stage3_time<<"m_stage3_airchoose"<<m_stage3_airchoose<<Qt::endl;
}
if(validBuf[4] == 0x74)
{
m_stage4_state = validBuf[6];
stage4_until.x[0] = validBuf[7];
stage4_until.x[1] = validBuf[8];
stage4_until.x[2] = validBuf[9];
stage4_until.x[3] = validBuf[10];
stage4_riserate.x[0] = validBuf[11];
stage4_riserate.x[1] = validBuf[12];
stage4_riserate.x[2] = validBuf[13];
stage4_riserate.x[3] = validBuf[14];
m_stage4_time = (validBuf[15]<<8)|validBuf[16];
m_stage4_airchoose = validBuf[17];
emit set_stage4_edit_box(m_stage4_state, stage4_until.f, stage4_riserate.f, m_stage4_time, m_stage4_airchoose);
qDebug()<<"read addr 0x74 success!"<<"m_stage4_state"<<m_stage4_state<<"stage4_until"
<<stage4_until.f<<"stage4_riserate"<<stage4_riserate.f<<"m_stage4_time"<<m_stage4_time<<"m_stage4_airchoose"<<m_stage4_airchoose<<Qt::endl;
}
if(validBuf[4] == 0x80)
{
m_stage5_state = validBuf[6];
stage5_until.x[0] = validBuf[7];
stage5_until.x[1] = validBuf[8];
stage5_until.x[2] = validBuf[9];
stage5_until.x[3] = validBuf[10];
stage5_riserate.x[0] = validBuf[11];
stage5_riserate.x[1] = validBuf[12];
stage5_riserate.x[2] = validBuf[13];
stage5_riserate.x[3] = validBuf[14];
m_stage5_time = (validBuf[15]<<8)|validBuf[16];
m_stage5_airchoose = validBuf[17];
emit set_stage5_edit_box(m_stage5_state, stage5_until.f, stage5_riserate.f, m_stage5_time, m_stage5_airchoose);
qDebug()<<"read addr 0x80 success!"<<"m_stage5_state"<<m_stage5_state<<"stage5_until"
<<stage5_until.f<<"stage5_riserate"<<stage5_riserate.f<<"m_stage5_time"<<m_stage5_time<<"m_stage5_airchoose"<<m_stage5_airchoose<<Qt::endl;
}
if(validBuf[4] == 0x8C)
{
m_stage6_state = validBuf[6];
stage6_until.x[0] = validBuf[7];
stage6_until.x[1] = validBuf[8];
stage6_until.x[2] = validBuf[9];
stage6_until.x[3] = validBuf[10];
stage6_riserate.x[0] = validBuf[11];
stage6_riserate.x[1] = validBuf[12];
stage6_riserate.x[2] = validBuf[13];
stage6_riserate.x[3] = validBuf[14];
m_stage6_time = (validBuf[15]<<8)|validBuf[16];
m_stage6_airchoose = validBuf[17];
emit set_stage6_edit_box(m_stage6_state, stage6_until.f, stage6_riserate.f, m_stage6_time, m_stage6_airchoose);
qDebug()<<"read addr 0x8C success!"<<"m_stage6_state"<<m_stage6_state<<"stage6_until"
<<stage6_until.f<<"stage6_riserate"<<stage6_riserate.f<<"m_stage6_time"<<m_stage6_time<<"m_stage6_airchoose"<<m_stage6_airchoose<<Qt::endl;
}
if(validBuf[4] == 0xE5)
{
fit_coff_a.x[0] = validBuf[6];
fit_coff_a.x[1] = validBuf[7];
fit_coff_a.x[2] = validBuf[8];
fit_coff_a.x[3] = validBuf[9];
fit_coff_b.x[0] = validBuf[10];
fit_coff_b.x[1] = validBuf[11];
fit_coff_b.x[2] = validBuf[12];
fit_coff_b.x[3] = validBuf[13];
fit_coff_c.x[0] = validBuf[14];
fit_coff_c.x[1] = validBuf[15];
fit_coff_c.x[2] = validBuf[16];
fit_coff_c.x[3] = validBuf[17];
///emit set_stage6_edit_box(fit_coff_a.f, fit_coff_b.f, fit_coff_c.f);
g_result1.a = fit_coff_a.f;
g_result1.b = fit_coff_b.f;
g_result1.c = fit_coff_c.f;
qDebug()<<"read addr 0xE5 success!"<<"fit_coff_a"<<fit_coff_a.f<<"fit_coff_b"<<fit_coff_b.f<<"fit_coff_c"<<fit_coff_c.f<<Qt::endl;
}
qDebug()<<"readback_len="<<readback_len<<Qt::endl;
qDebug()<<"read target success!"<<Qt::endl;
}else
{
qDebug()<<"read target failed!"<<Qt::endl;
}
std::free(sendBuf);
sendBuf = NULL;
}
if(m_write_flag == 1)
{
m_write_flag = 0;
int lbuf = m_dealSendBytes.size(); //总数据长度
dealBuf = (unsigned char*)std::malloc(lbuf);
std::memcpy(dealBuf, (unsigned char*)m_dealSendBytes.data(), lbuf);
if(validBuf[4] == dealBuf[4])
{
qDebug()<<"write target success!"<<Qt::endl;
emit write_target_success();
}else
{
qDebug()<<"write target failed!"<<Qt::endl;
///emit write_target_failed();
}
std::free(dealBuf);
dealBuf = NULL;
}
}
std::free(objBuf);
std::free(validBuf);
objBuf = NULL;
validBuf = NULL;
}
}
uint16_t SerialWorker::CRC16_MODBUS(unsigned char *data, unsigned int datalen)
{
unsigned short wCRCin = 0xFFFF;
unsigned short wCPoly = 0x8005;
InvertUint16(&wCPoly,&wCPoly);
while (datalen--)
{
wCRCin ^= *(data++);
for(int i = 0;i < 8;i++)
{
if(wCRCin & 0x01)
wCRCin = (wCRCin >> 1) ^ wCPoly;
else
wCRCin = wCRCin >> 1;
}
}
return (wCRCin);
}
void SerialWorker::InvertUint16(unsigned short *dBuf,unsigned short *srcBuf)
{
int i;
unsigned short tmp[4]={0};
for(i=0;i< 16;i++)
{
if(srcBuf[0]& (1 << i))
tmp[0]|=1<<(15 - i);
}
dBuf[0] = tmp[0];
}
//CRC16计算函数
uint16_t SerialWorker::ModbusCRC16(QByteArray senddata)
{
int len=senddata.size();
uint16_t wcrc=0XFFFF;//预置16位crc寄存器初值全部为1
uint8_t temp;//定义中间变量
int i=0,j=0;//定义计数
for(i=0;i<len;i++)//循环计算每个数据
{
temp=senddata.at(i);
wcrc^=temp;
for(j=0;j<8;j++){
//判断右移出的是不是1如果是1则与多项式进行异或。
if(wcrc&0X0001){
wcrc>>=1;//先将数据右移一位
wcrc^=0XA001;//与上面的多项式进行异或
}
else//如果不是1则直接移出
wcrc>>=1;//直接移出
}
}
temp=wcrc;//crc的值
return wcrc;
}
void SerialWorker::write_data(QByteArray SendBytes)
{
// 串口未打开
if ( !m_bOpen )
{
qDebug() << "串口未打开,发送失败!" << Qt::endl;
emit serial_port_not_open();
return;
}
if ( !SendBytes.isEmpty() )
{
port->write(SendBytes);
qDebug() << "写端口完成!" << Qt::endl;
}
m_dealSendBytes = SendBytes;
qDebug() << "write_id is:" << QThread::currentThreadId();
}