110VCGQ/485SWJ/CGQ485V2/CGQ485/mainwindow.cpp
2024-12-30 15:29:57 +08:00

1025 lines
27 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialogsetport.h"
#include <QMessageBox>
#include <QByteArray>
#include <QTimer>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QChartView>
#include <QLineSeries>
#include <QtMath>
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
port = new DialogSetPort(this);
fileset = new FileSet(this);
userhelp = new UserHelp();
fileName = new QString;
file = new QFile;
fileData = new QByteArray();
crc = new CRC;
time1 = new QTimer(this); //接收数据
time2 = new QTimer(this); //定时发送
time3 = new QTimer(this); //定时发送
time4 = new QTimer(this); //定时发送
time5 = new QTimer(this); //定时发送
currentzAxis = new QDateTime();
time1->setInterval(200);
connect(time1,&QTimer::timeout,this,&MainWindow::on_Time1_out);
connect(time2,&QTimer::timeout,this,&MainWindow::on_pushButton_read03_clicked);
connect(time3,&QTimer::timeout,this,&MainWindow::on_pushButton_readonce_clicked);
connect(time4,&QTimer::timeout,this,&MainWindow::sendNextFile);
connect(time5,&QTimer::timeout,this,&MainWindow::sendNextFile);
connect(&port->mSerialPort,&QSerialPort::readyRead,this,&MainWindow::on_SerialPort_readyRead);
//第一个绘图区域
chart = new QChart();
axisY = new QValueAxis;
axisY3 = new QValueAxis;
axisX = new QDateTimeAxis;
chart->addAxis(axisX,Qt::AlignBottom); //添加坐标系
chart->addAxis(axisY,Qt::AlignLeft);
for(int i=0;i<15;i++)
{
lineSeries[i] = new QLineSeries;
chart->addSeries(lineSeries[i]);
lineSeries[i]->setName(QString::asprintf("%d",i+1));
lineSeries[i]->attachAxis(axisX);
lineSeries[i]->attachAxis(axisY);
}
chart->setTitle("曲线图");
ui->graphicsView->setChart(chart);
// ui->graphicsView_2->setChart(chart);
*currentzAxis = QDateTime::currentDateTime();
axisX->setTitleText("时间(分:秒),1s/格");
// axisX->setGridLineVisible(false); //隐藏网格
axisX->setLabelsAngle(35); //x轴文字倾斜角度
axisX->setTickCount(11); //轴上点的个数
axisX->setMin(currentzAxis->addSecs(Xmin));
axisX->setMax(currentzAxis->addSecs(Xmax));
axisX->setFormat("mm:ss");
axisY->setTickCount(11);
axisY->setRange(Ymin,Ymax);
//设置坐标轴显示的名称
QFont font("Microsoft YaHei",8,QFont::Normal);//微软雅黑。字体大小8
axisX->setTitleFont(font);
axisX->setLabelsFont(font);
axisY->setTitleFont(font);
axisY->setTitleText("数据/mV");
//设置网格不显示
axisY->setGridLineVisible(true);
axisY3->setTickCount(11);
axisY3->setRange(0,1200);
axisY3->setTitleFont(font);
axisY3->setTitleText("数据/mV");
//设置网格不显示
axisY3->setGridLineVisible(true);
/*******************************************************/
/*第二个表格初始化*/
chart2 = new QChart;
axisY2 = new QValueAxis;
axisX2 = new QDateTimeAxis;
//添加坐标系
chart2->addAxis(axisX2,Qt::AlignBottom); //添加坐标系
chart2->addAxis(axisY2,Qt::AlignLeft);
for(int i=0;i<5;i++)
{
lineSeries2[i] = new QLineSeries;
chart2->addSeries(lineSeries2[i]);
lineSeries2[i]->attachAxis(axisX2);
lineSeries2[i]->attachAxis(axisY2);
}
lineSeries2[0]->setName("原始数据");
lineSeries2[1]->setName("投退");
lineSeries2[2]->setName("温度");
lineSeries2[3]->setName("湿度");
lineSeries2[4]->setName("电压");
chart2->setTitle("曲线图");
ui->graphicsView_2->setChart(chart2);
*currentzAxis = QDateTime::currentDateTime();
axisX2->setTitleText("时间(分:秒),1s/格");
// axisX->setGridLineVisible(false); //隐藏网格
axisX2->setLabelsAngle(35); //x轴文字倾斜角度
axisX2->setTickCount(11); //轴上点的个数
axisX2->setMin(currentzAxis->addSecs(Xmin2));
axisX2->setMax(currentzAxis->addSecs(Xmax2));
axisX2->setFormat("mm:ss");
axisY2->setTickCount(11);
axisY2->setRange(Ymin2,Ymax2);
//设置坐标轴显示的名称
QFont font2("Microsoft YaHei",8,QFont::Normal);//微软雅黑。字体大小8
axisX2->setTitleFont(font);
axisX2->setLabelsFont(font);
axisY2->setTitleFont(font);
// axisY2->setTitleText("数据");
//设置网格不显示
axisY2->setGridLineVisible(true);
}
MainWindow::~MainWindow()
{
delete ui;
}
//串口读取数据
void MainWindow::on_SerialPort_readyRead()
{
QByteArray array = port->mSerialPort.readAll();
uint8_t *b = (uint8_t*)array.data();
int16_t data;
uint16_t data2;
QString string;
for(int i =0;i<array.size();i++)
{
string.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper());
string.append(" ");
}
// for(int i =0;i<array.size();i=i+2)
// {
// lineSeries[0]->append(i,array[i]<<8|array[i+1]);
// }
if(state == readVersion)
ui->lineEdit_Version->setText(array);
switch (array[1]) {
case 0x03:
data =(b[3]<<8)|b[4];
switch (state) {
case readPWM:
ui->lineEdit_PWM->setText(QString::number(data,10));
break;
case readFactor:
ui->lineEdit_Factor->setText(QString::number(data,10));
break;
case readData:
if(array.size() >= 9)
{
data2 = (b[5]<<8)|b[6];
ui->lineEdit_data03->setText(QString::number(data,10));
ui->lineEdit_state03->setText(QString::number(data2,10));
string.append(" ");
string.append(QString::number(data,10));
draw_Line(b[0],data);
}
else if(array.size() == 7)
{
data2 = 0;
ui->lineEdit_data03->setText(QString::number(data,10));
ui->lineEdit_state03->setText(QString::number(data2,10));
string.append(" ");
string.append(QString::number(data,10));
draw_Line(b[0],data);
}
//写文件
else if(array[1]==0x03 && array[2] == 18 )
{
write_time += (double)time2->interval()/1000;
qDebug()<<write_time;
draw_Line(b[0],data);
data2 = (b[5]<<8)|b[6];
ui->lineEdit_data03->setText(QString::number(data,10));
ui->lineEdit_state03->setText(QString::number(data2,10));
if(write_time >= fileset->interval && fileset->isWrite == true)
{
int16_t data[10];
QDateTime cDateTime = QDateTime::currentDateTime();
QString wstring = cDateTime.toString("yy.MM.dd hh:mm:ss")+"\t";
write_time = 0;
for(int i =0;i<9;i++)
{
if(i==8)
{
data[i] = b[2*i+3];
wstring += QString::number(data[i],10)+"\t";
data[i+1] = b[2*i+4];
wstring += QString::number(data[i+1],10)+"\n";
}
else
{
data[i] = (b[2*i+3]<<8)|b[2*i+4];
wstring += QString::number(data[i],10)+"\t";
}
}
fileset->Write_File(wstring.toUtf8());
}
}
break;
case readAll:
dataTreating(array);
break;
default:
break;
}
break;
case 0x06:
switch (state)
{
case readAll:
dataTreating(array);
break;
default:
break;
}
break;
case 0x10:
switch (state) {
case sendFile:
if(array.size() == 8)
{
QString str2 = QString("<span style='color: red;'> %1</span>").arg(string);
ui->SendFile_textEdit->append(str2);
uint16_t dat1 =(b[2]<<8)|b[3];
if(dat1 != 0xFFFF)
{
CurrentIndex++;
sendNextFile();
}
}
else
{
static uint8_t err = 0;
QString str2 = QString("<span style='color: red;'> %1</span>").arg(string);
ui->SendFile_textEdit->append(str2);
sendNextFile();
}
break;
default:
break;
}
break;
default:
break;
}
ui->textEdit_Receive->append(string);
}
void MainWindow::on_Time1_out()
{
time1->stop();
state = None;
}
//串口设置
void MainWindow::on_setSerilport_triggered()
{
port->exec();
}
//获取版本信息
void MainWindow::on_readVersion_clicked()
{
bool ok;
QString byte;
uint16_t crcValue;
uint8_t b[8];
state = readVersion;
b[0]=ui->lineEdit_addr->text().toInt(&ok,10);//485地址
b[1]=0x03; //功能位
b[2]=0x00;
b[3]=0xFF; //寄存器地址
b[4]=0x00;
b[5]=0x01; //寄存器个数
crcValue= crc->crc16_modbus(b,6);
b[6] = crcValue&0x00FF;
b[7] =crcValue>>8;
for(int i=0;i<8;i++)
{
byte.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper());
byte.append(" ");
}
if(port==NULL || !port->mSerialPort.isOpen())
{
QMessageBox::information(this,"","串口未打开或不存在");
}
else
{
ui->textEdit_Send->append(byte);
port->mSerialPort.write((const char*)(b),8);
}
}
//读取PWM波
void MainWindow::on_readPWM_clicked()
{
QString byte;
uint16_t crcValue;
uint8_t b[8];
bool ok;
state = readPWM;
b[0]=ui->lineEdit_addr->text().toInt(&ok,10); //485地址
b[1]=0x03; //功能位
b[2]=0x00;
b[3]=0x04; //寄存器地址
b[4]=0x00;
b[5]=0x01; //寄存器个数
crcValue= crc->crc16_modbus(b,6);
b[6] = crcValue&0x00FF;
b[7] =crcValue>>8;
for(int i=0;i<8;i++)
{
byte.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper());
byte.append(" ");
}
if(port==NULL || !port->mSerialPort.isOpen())
{
QMessageBox::information(this,"","串口未打开或不存在");
}
else
{
ui->textEdit_Send->append(byte);
port->mSerialPort.write((const char*)(b),8);
}
}
//读取修正系数
void MainWindow::on_readFactor_clicked()
{
QString byte;
uint16_t crcValue;
uint8_t b[8];
bool ok;
state = readFactor;
b[0]=ui->lineEdit_addr->text().toInt(&ok,10);//485地址
b[1]=0x03; //功能位
b[2]=0x00;
b[3]=0x05; //寄存器地址
b[4]=0x00;
b[5]=0x01; //寄存器个数
crcValue= crc->crc16_modbus(b,6);
b[6] = crcValue&0x00FF;
b[7] =crcValue>>8;
for(int i=0;i<8;i++)
{
byte.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper());
byte.append(" ");
}
if(port==NULL || !port->mSerialPort.isOpen())
{
QMessageBox::information(this,"","串口未打开或不存在");
}
else
{
ui->textEdit_Send->append(byte);
port->mSerialPort.write((const char*)(b),8);
}
}
//读取测量数据
void MainWindow::on_pushButton_read03_clicked()
{
QString byte;
uint16_t crcValue;
uint8_t b[8];
bool ok;
state = readData;
int addr = ui->lineEdit_addr03->text().toInt(&ok,10);
if(ok == false) addr = ui->lineEdit_addr03->text().toInt(&ok,16);
b[0]=addr;//485地址
b[1]=0x03; //功能位
b[2]=0x00;
b[3]=ui->lineEdit_reg03->text().toInt(&ok,10); //寄存器地址
if(ok == false)b[3]=ui->lineEdit_reg03->text().toInt(&ok,16); //寄存器地址
b[4]=0x00;
b[5]=ui->lineEdit_num03->text().toInt(&ok,10); //寄存器个数
if(ok == false)b[5]=ui->lineEdit_num03->text().toInt(&ok,16);
crcValue= crc->crc16_modbus(b,6);
b[6] = crcValue&0x00FF;
b[7] =crcValue>>8;
for(int i=0;i<8;i++)
{
byte.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper());
byte.append(" ");
}
if(port==NULL || !port->mSerialPort.isOpen())
{
time2->stop();
ui->checkBox_timer->setChecked(false);
QMessageBox::information(this,"","串口未打开或不存在");
}
else
{
ui->textEdit_Send->append(byte);
port->mSerialPort.write((const char*)(b),8);
}
}
//设置PWM波脉宽
void MainWindow::on_setPWM_clicked()
{
QString byte;
uint16_t crcValue;
uint8_t b[8];
bool ok;
uint16_t data = ui->lineEdit_PWM->text().toInt(&ok,10);
b[0]=ui->lineEdit_addr->text().toInt(&ok,10);//485地址
b[1]=0x06; //功能位
b[2]=0x00;
b[3]=0x04; //寄存器地址
b[4]=data>>8;
b[5]=data & 0x00FF; //寄存器个数
crcValue= crc->crc16_modbus(b,6);
b[6] = crcValue&0x00FF;
b[7] =crcValue>>8;
for(int i=0;i<8;i++)
{
byte.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper());
byte.append(" ");
}
if(port==NULL || !port->mSerialPort.isOpen())
{
QMessageBox::information(this,"","串口未打开或不存在");
}
else
{
ui->textEdit_Send->append(byte);
port->mSerialPort.write((const char*)(b),8);
}
}
//设置修正系数
void MainWindow::on_setFactor_clicked()
{
QString byte;
uint16_t crcValue;
uint8_t b[8];
bool ok;
uint16_t data = ui->lineEdit_Factor->text().toInt(&ok,10);
b[0]=ui->lineEdit_addr->text().toInt(&ok,10);//485地址
b[1]=0x06; //功能位
b[2]=0x00;
b[3]=0x05; //寄存器地址
b[4]=data>>8;
b[5]=data & 0x00FF; //寄存器个数
crcValue= crc->crc16_modbus(b,6);
b[6] = crcValue&0x00FF;
b[7] =crcValue>>8;
for(int i=0;i<8;i++)
{
byte.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper());
byte.append(" ");
}
if(port==NULL || !port->mSerialPort.isOpen())
{
QMessageBox::information(this,"","串口未打开或不存在");
}
else
{
ui->textEdit_Send->append(byte);
port->mSerialPort.write((const char*)(b),8);
}
}
//清除发送区域
void MainWindow::on_pushButton_ClearS_clicked()
{
ui->textEdit_Send->clear();
}
void MainWindow::on_pushButton_ClearR_clicked()
{
ui->textEdit_Receive->clear();
}
//03指令地址增加
void MainWindow::on_pushButton_addrUP_clicked()
{
bool ok;
uint8_t a = ui->lineEdit_addr03->text().toInt(&ok,10);
if(ok == true)
{
ui->lineEdit_addr03->setText(QString::number(a+1,10));
}
else
{
a = ui->lineEdit_addr03->text().toInt(&ok,16);
ui->lineEdit_addr03->setText("0x"+QString("%1").arg(a+1,2,16,QLatin1Char('0')).toUpper());
}
}
//30指令地址减小
void MainWindow::on_pushButton_addrDOWN_clicked()
{
bool ok;
uint8_t a = ui->lineEdit_addr03->text().toInt(&ok,10);
if(ok == true)
{
if(a>1)a=a-1;
ui->lineEdit_addr03->setText(QString::number(a,10));
}
else
{
a = ui->lineEdit_addr03->text().toInt(&ok,16);
if(a>1)a=a-1;
ui->lineEdit_addr03->setText("0x"+QString("%1").arg(a,2,16,QLatin1Char('0')).toUpper());
}
}
void MainWindow::on_pushButton_reset03_clicked()
{
ui->lineEdit_addr03->setText("0x01");
}
//自动发送
void MainWindow::on_checkBox_timer_clicked(bool checked)
{
if(checked == true)
{
time2->setInterval(ui->spinBox_timer->text().toInt());
time2->start();
}
else
{
time2->stop();
}
}
//修改地址
void MainWindow::on_pushButton_send06_clicked()
{
QString byte;
uint16_t crcValue;
uint8_t b[8];
bool ok;
state = readData;
b[0]=ui->lineEdit_addr06->text().toInt(&ok,10);//485地址
if(ok == false)b[0]=ui->lineEdit_addr06->text().toInt(&ok,16);//485地址
b[1]=0x06; //功能位
b[2]=(ui->lineEdit_reg06->text().toInt(&ok,10))>>8;
b[3]=ui->lineEdit_reg06->text().toInt(&ok,10); //寄存器地址
if(ok == false)
{
b[2]=(ui->lineEdit_reg06->text().toInt(&ok,16))>>8;
b[3]=ui->lineEdit_reg06->text().toInt(&ok,16);
}
b[4]=(ui->lineEdit_num06->text().toInt(&ok,10)) >> 8;
b[5]=ui->lineEdit_num06->text().toInt(&ok,10); //寄存器数据/
if(ok == false)
{
b[4]=(ui->lineEdit_num06->text().toInt(&ok,16)) >> 8;
b[5]=ui->lineEdit_num06->text().toInt(&ok,16);
}
crcValue= crc->crc16_modbus(b,6);
b[6] = crcValue&0x00FF;
b[7] =crcValue>>8;
for(int i=0;i<8;i++)
{
byte.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper());
byte.append(" ");
}
if(port==NULL || !port->mSerialPort.isOpen())
{
QMessageBox::information(this,"","串口未打开或不存在");
}
else
{
ui->textEdit_Send->append(byte);
port->mSerialPort.write((const char*)(b),8);
if(ui->checkBox_increase->isChecked())
{
if(ui->comboBox_current->currentIndex()< ui->comboBox_aim->currentIndex())
{
int index = ui->comboBox_current->currentIndex()+1;
ui->comboBox_current->setCurrentIndex(index);
}
else
{
ui->comboBox_current->setCurrentIndex(0);
}
}
}
}
void MainWindow::on_comboBox_current_currentIndexChanged(int index)
{
ui->lineEdit_num06->setText("0x00"+QString("%1").arg(index+1,2,16,QLatin1Char('0')).toUpper());
}
//地址复位
void MainWindow::on_pushButton_reset06_clicked()
{
QString byte;
uint16_t crcValue;
uint8_t b[8];
bool ok;
state = readData;
b[0]=00;//485地址
b[1]=0x06; //功能位
b[2]=0x00;
b[3]=ui->lineEdit_reg06->text().toInt(&ok,16); //寄存器地址
b[4]=0x00;
b[5]=0x01; //数据
crcValue= crc->crc16_modbus(b,6);
b[6] = crcValue&0x00FF;
b[7] =crcValue>>8;
for(int i=0;i<8;i++)
{
byte.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper());
byte.append(" ");
}
if(port==NULL || !port->mSerialPort.isOpen())
{
QMessageBox::information(this,"","串口未打开或不存在");
}
else
{
ui->textEdit_Send->append(byte);
port->mSerialPort.write((const char*)(b),8);
}
}
//graphicView区域x轴缩小
void MainWindow::on_pButton_HorizDec_clicked()
{
Xmin = Xmin*2;
Xmax = Xmax*2;
QList<QAbstractAxis*> list= chart->axes(Qt::Horizontal);
list[0]->setMin(currentzAxis->addSecs(Xmin));
list[0]->setMax(currentzAxis->addSecs(Xmax));
int a = axisX->max().toSecsSinceEpoch()-axisX->min().toSecsSinceEpoch();
axisX->setTitleText(QString::asprintf("时间(分:秒) %ds/格",a/10));
}
//graphicView区域x轴放大
void MainWindow::on_pButton_HorizInc_clicked()
{
Xmin = Xmin/2;
Xmax = Xmax/2;
QList<QAbstractAxis*> list= chart->axes(Qt::Horizontal);
// qDebug()<<axisX->max().toSecsSinceEpoch()-axisX->min().toSecsSinceEpoch();
list[0]->setMin(currentzAxis->addSecs(Xmin));
list[0]->setMax(currentzAxis->addSecs(Xmax));
int a = axisX->max().toSecsSinceEpoch()-axisX->min().toSecsSinceEpoch();
axisX->setTitleText(QString::asprintf("时间(分:秒) %ds/格",a/10));
}
//graphicView区域y轴放大
void MainWindow::on_phButton_VertitalInc_clicked()
{
Ymin += 200 ;
Ymax -= 200 ;
chart->axes(Qt::Vertical).at(0)->setRange(Ymin,Ymax);
// chart->axisY()->setRange(Ymin,Ymax);
}
//graphicView区域y轴缩小
void MainWindow::on_phButton_VertitalDec_clicked()
{
Ymin = Ymin-200;
Ymax = Ymax+200;
chart->axes(Qt::Vertical).at(0)->setRange(Ymin,Ymax);
// qDebug()<<chart->axes(Qt::Vertical);
}
void MainWindow::draw_Line(int addr, int data)
{
int ad = addr%14;
*currentzAxis = QDateTime::currentDateTime();
QList<QAbstractAxis*> list= chart->axes(Qt::Horizontal);
list[0]->setMin(currentzAxis->addSecs(Xmin));
list[0]->setMax(currentzAxis->addSecs(Xmax));
lineSeries[ad]->append(currentzAxis->toMSecsSinceEpoch(),data);
}
void MainWindow::on_pButton_gViewClear_clicked()
{
for(int i = 0;i<20;i++)
{
lineSeries[i]->clear();
}
}
void MainWindow::on_fileSet_triggered()
{
fileset->exec();
}
void MainWindow::on_help_action_triggered()
{
userhelp->show();
}
//打开文件并分包
void MainWindow::on_OpenFile_Btn_clicked()
{
groupedData.clear();
QString curDir = QCoreApplication::applicationDirPath();
*fileName = QFileDialog::getOpenFileName(this,"选择一个txt文件",curDir,"*.bin");
file->setFileName(*fileName);
if(!file->open(QIODevice::ReadOnly))
{
QMessageBox::information(this,"提示","文件打开失败");
return;
}
qint32 FileSize = file->size();
ui->fileName_LEdit->setText(*fileName+" "+QString::number(FileSize)+"byte");
*fileData = file->readAll();
if(fileData->size() != FileSize)
{
QMessageBox::information(this,"提示","文件读取失败");
return;
}
const int groupSize = 128;
for (int i = 0; i < FileSize; i += groupSize) {
// 从 fileData 里截取 groupSize 大小的字节
QByteArray chunk = fileData->mid(i, groupSize);
// 如果截取的字节数不足 128则进行填充
if (chunk.size() < groupSize) {
chunk.append(QByteArray(groupSize - chunk.size(), static_cast<char>(0xFF)));
}
// 将分组后的数据添加到 QVector
groupedData.append(chunk);
}
// 输出每组数据
QString string;
string = QString("文件分包成功每组128个数据共%1组").arg(groupedData.size());
ui->SendFile_textEdit->append(string);
}
//开始发送文件
void MainWindow::on_SenFile_Btn_clicked()
{
QString byte;
uint16_t crcValue;
uint8_t b[137];
state = sendFile;
CurrentIndex = 0; //数据段数复位
if(!file->isOpen())
{
QMessageBox::warning(this,"提示","请选择一个bin文件");
return;
}
qint32 FileSize = file->size();
uint8_t cnt =0;
if(ui->danbo_rBtn->isChecked())
{
start_addr = ui->start_spinBox->text().toInt();
over_addr = ui->end_spinBox->text().toInt();
current_addr = start_addr;
b[cnt++]=current_addr;//485地址
}
else {
b[cnt++]=0;//485地址
time5->setInterval(300);
time5->start();
}
b[cnt++]=0x10; //功能位
b[cnt++]=CurrentIndex>>8; //寄存器起始地址
b[cnt++]=CurrentIndex&0xFF;
b[cnt++]=0; //寄存器个数
b[cnt++]=1;
b[cnt++]= 2; //字节数
b[cnt++] = FileSize>>8;
b[cnt++] = FileSize&0xFF;
crcValue= crc->crc16_modbus(b,cnt);
b[cnt++] = crcValue&0x00FF;
b[cnt++] =crcValue>>8;
for(int i=0;i<cnt;i++)
{
byte.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper());
byte.append(" ");
}
if(port==NULL || !port->mSerialPort.isOpen())
{
QMessageBox::information(this,"","串口未打开或不存在");
}
else
{
ui->SendFile_textEdit->append(byte);
port->mSerialPort.write((const char*)(b),cnt);
}
}
//发送后续文件
void MainWindow::sendNextFile()
{
QString byte;
uint16_t crcValue;
uint8_t b[150] ={0};
state = sendFile;
uint8_t cnt =0;
if(ui->danbo_rBtn->isChecked())
{
b[cnt++]=current_addr;//485地址
//打开定时器4
time4->setInterval(300);
time4->start();
}
else {
b[cnt++]=0;//485地址
CurrentIndex++;
}
if(CurrentIndex>groupedData.size())
{
on_overSend_Btn_clicked();
return;
}
b[cnt++]=0x10; //功能位
b[cnt++]=CurrentIndex>>8; //寄存器起始地址
b[cnt++]=CurrentIndex&0xFF;
b[cnt++]=0; //寄存器个数
b[cnt++]=64;
b[cnt++]= 128; //字节数
QByteArray datatosend = groupedData[CurrentIndex-1];
std::memcpy(&b[cnt],datatosend.constData(),128);
cnt = cnt+128;
crcValue= crc->crc16_modbus(b,cnt);
b[cnt++] = crcValue&0x00FF;
b[cnt++] =crcValue>>8;
for(int i=0;i<cnt;i++)
{
byte.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper());
byte.append(" ");
}
if(port==NULL || !port->mSerialPort.isOpen())
{
QMessageBox::information(this,"","串口未打开或不存在");
}
else
{
ui->SendFile_textEdit->append(byte);
port->mSerialPort.write((const char*)(b),cnt);
ui->progressBar->setValue(CurrentIndex*100/groupedData.size());
}
}
//发送结束报文
void MainWindow::on_overSend_Btn_clicked()
{
QString byte;
uint16_t crcValue;
uint8_t b[137];
state = sendFile;
ui->progressBar->setValue(0);
uint8_t cnt =0;
if(ui->danbo_rBtn->isChecked())
{
start_addr = ui->start_spinBox->text().toInt();
over_addr = ui->end_spinBox->text().toInt();
current_addr = start_addr;
b[cnt++]=current_addr;//485地址
}
else {
b[cnt++]=0;//485地址
// CurrentIndex++;
}
b[cnt++]=0x10; //功能位
b[cnt++]=0xFF; //寄存器起始地址
b[cnt++]=0xFF;
b[cnt++]=0; //寄存器个数
b[cnt++]=1;
b[cnt++]= 2; //字节数
b[cnt++] = CurrentIndex>>8;
b[cnt++] = CurrentIndex&0xFF;
crcValue= crc->crc16_modbus(b,cnt);
b[cnt++] = crcValue&0x00FF;
b[cnt++] =crcValue>>8;
for(int i=0;i<cnt;i++)
{
byte.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper());
byte.append(" ");
}
if(port==NULL || !port->mSerialPort.isOpen())
{
QMessageBox::information(this,"","串口未打开或不存在");
}
else
{
ui->SendFile_textEdit->append(byte);
port->mSerialPort.write((const char*)(b),cnt);
//停止定时器44
time4->stop();
time5->stop();
}
}
void MainWindow::on_clear3_Btn_clicked()
{
ui->SendFile_textEdit->clear();
}