110VCGQ/485SWJ/CGQ485V2/CGQ485/mainwindow.cpp

1029 lines
27 KiB
C++
Raw Normal View History

2024-11-18 10:09:39 +08:00
#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(CurrentIndex>groupedData.size())
{
on_overSend_Btn_clicked();
return;
}
if(ui->danbo_rBtn->isChecked())
{
b[cnt++]=current_addr;//485地址
//打开定时器4
time4->setInterval(300);
time4->start();
}
else {
b[cnt++]=0;//485地址
CurrentIndex++;
}
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());
// //打开定时器4
// time4->setInterval(300);
// time4->start();
}
}
//发送结束报文
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();
}