#include "mainwindow.h" #include "ui_mainwindow.h" #include "dialogsetport.h" #include #include #include #include #include #include #include #include #include #include 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;iappend(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()<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(" %1").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(" %1").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 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 list= chart->axes(Qt::Horizontal); // qDebug()<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()<axes(Qt::Vertical); } void MainWindow::draw_Line(int addr, int data) { int ad = addr%14; *currentzAxis = QDateTime::currentDateTime(); QList 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(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;imSerialPort.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;imSerialPort.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;imSerialPort.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(); }