1025 lines
27 KiB
C++
1025 lines
27 KiB
C++
#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();
|
||
}
|
||
|