#include "mainwidget.h" #include "ui_mainwidget.h" #include "Data_Ctrl.h" #include #include MainWidget::MainWidget(QWidget *parent) : QWidget(parent) , ui(new Ui::MainWidget) { ui->setupUi(this); ui->serialCB->clear(); m_USBCtrl.SerialPortInit(); connect(Data_Ctrl::getData()->serialPort,SIGNAL(readyRead()),this,SLOT(manual_serialPortReadyRead()));/*手动连接槽函数*/ InitUI(); InitConnect(); // 定时发送-定时器 timSend = new QTimer; timSend->setInterval(1000);// 设置默认定时时长1000ms connect(timSend, &QTimer::timeout, this, [=](){ on_Button_tx_clicked(); }); //QString currentPath = QDir::currentPath(); m_TotalCHNum=24; m_CurPhase=1; for (int i=0;i<64;i++) { m_PDUCHInfo[i].CHNum=i+1; m_PDUCHInfo[i].CHName.sprintf("CH%d", i+1); } InitCHTable(m_TotalCHNum,true); _timer_update_info = new QTimer(this); _timer_update_info->setInterval(1000); connect(_timer_update_info, SIGNAL(timeout()), this, SLOT(UpdateStatusInfo())); _timer_update_info->start(); } MainWidget::~MainWidget() { delete ui; } void MainWidget::InitUI() { //通过QSerialPortInfo查找可用串口 foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { ui->serialCB->addItem(info.portName()); } // 发送、接收计数清零 sendNum = 0; recvNum = 0; // 状态栏的收、发计数标签 lblSendNum = new QLabel(this); lblRecvNum = new QLabel(this); lblPortState = new QLabel(this); lblPortState->setText("Connected"); //设置串口状态标签为绿色 表示已连接状态 lblPortState->setStyleSheet("color:red"); // 设置标签最小大小 lblSendNum->setMinimumSize(100, 20); lblRecvNum->setMinimumSize(100, 20); lblPortState->setMinimumSize(550, 20); setNumOnLabel(lblSendNum, "S: ", sendNum); setNumOnLabel(lblRecvNum, "R: ", recvNum); // 从右往左依次添加 ui->horizontalLayout_7->addWidget(lblPortState); ui->horizontalLayout_7->addWidget(lblSendNum); ui->horizontalLayout_7->addWidget(lblRecvNum); ui->pushButton_L1->setIcon(QIcon("resource/Started.png")); ui->pushButton_L2->setIcon(QIcon("resource/Reset.png")); ui->pushButton_L3->setIcon(QIcon("resource/Reset.png")); ui->pushButton_ALLOPEN->setIcon(QIcon("resource/open.png")); ui->pushButton_ALLCLOSE->setIcon(QIcon("resource/close.png")); } void MainWidget::InitCHTable(int CHNum,bool initFlag) { if(CHNum>64) return; if(initFlag) { ui->tableWidget_CHInfo->setColumnCount(10); ui->tableWidget_CHInfo->setRowCount(CHNum); QStringList pTableHeadList; pTableHeadList<< "通道" << "名称" << "相位" << "电压(V)" << "电流(A)"<< "功率(W)" << "功率因数" << "耗电量(kWh)" << "状态" << "操作"; ui->tableWidget_CHInfo->setHorizontalHeaderLabels(pTableHeadList); ui->tableWidget_CHInfo->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->tableWidget_CHInfo->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableWidget_CHInfo->setSelectionMode(QAbstractItemView::SingleSelection); ui->tableWidget_CHInfo->verticalHeader()->hide(); ui->tableWidget_CHInfo->setFont(QFont("Helvetica")); ui->tableWidget_CHInfo->setColumnWidth(0, 60); ui->tableWidget_CHInfo->setColumnWidth(1, 100); ui->tableWidget_CHInfo->setColumnWidth(2, 100); ui->tableWidget_CHInfo->setColumnWidth(3, 100); ui->tableWidget_CHInfo->setColumnWidth(4, 100); ui->tableWidget_CHInfo->setColumnWidth(5, 100); ui->tableWidget_CHInfo->setColumnWidth(6, 100); ui->tableWidget_CHInfo->setColumnWidth(7, 100); ui->tableWidget_CHInfo->setColumnWidth(8, 80); ui->tableWidget_CHInfo->setColumnWidth(9, 80); } ui->tableWidget_CHInfo->clearContents(); for (int i = 0; i < CHNum;i++) { ui->tableWidget_CHInfo->setRowHeight(i, 50); QString chid; chid.sprintf("%d", m_PDUCHInfo[i].CHNum); QTableWidgetItem *newItem0 = new QTableWidgetItem(chid); newItem0->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui->tableWidget_CHInfo->setItem(i, 0, newItem0); QTableWidgetItem *newItem1 = new QTableWidgetItem(m_PDUCHInfo[i].CHName); newItem1->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui->tableWidget_CHInfo->setItem(i, 1, newItem1); QTableWidgetItem *newItem3; if (0 == m_PDUCHInfo[i].CHPhase) newItem3 = new QTableWidgetItem("L1"); else if (1 == m_PDUCHInfo[i].CHPhase) newItem3 = new QTableWidgetItem("L2"); else if (2 == m_PDUCHInfo[i].CHPhase) newItem3 = new QTableWidgetItem("L3"); else newItem3 = new QTableWidgetItem("Null"); newItem3->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui->tableWidget_CHInfo->setItem(i, 2, newItem3); QString chV; chV.sprintf("%0.3f", m_PDUCHInfo[i].CHVoltage); QTableWidgetItem *newItem4 = new QTableWidgetItem(chV); newItem4->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui->tableWidget_CHInfo->setItem(i, 3, newItem4); QString chI; chI.sprintf("%0.3f", m_PDUCHInfo[i].CHCurrent); QTableWidgetItem *newItem5 = new QTableWidgetItem(chI); newItem5->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui->tableWidget_CHInfo->setItem(i, 4, newItem5); QString chP; chP.sprintf("%0.3f", m_PDUCHInfo[i].CHPower); QTableWidgetItem *newItem6 = new QTableWidgetItem(chP); newItem6->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui->tableWidget_CHInfo->setItem(i, 5, newItem6); QString chF; chF.sprintf("%0.3f", m_PDUCHInfo[i].CHFactor); QTableWidgetItem *newItem7 = new QTableWidgetItem(chF); newItem7->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui->tableWidget_CHInfo->setItem(i, 6, newItem7); QString chC; chC.sprintf("%0.3f", m_PDUCHInfo[i].CHConsumption); QTableWidgetItem *newItem8 = new QTableWidgetItem(chC); newItem8->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui->tableWidget_CHInfo->setItem(i, 7, newItem8); QTableWidgetItem *newItem9; if (m_PDUCHInfo[i].CHStatus) newItem9=new QTableWidgetItem(QIcon("resource/open.png"), "接通"); else newItem9 = new QTableWidgetItem(QIcon("resource/close.png"), "断开"); newItem9->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui->tableWidget_CHInfo->setItem(i, 8, newItem9); QPushButton* buttonoper; if (m_PDUCHInfo[i].CHStatus) buttonoper=new QPushButton(QStringLiteral("OFF"), ui->tableWidget_CHInfo); else buttonoper=new QPushButton(QStringLiteral("ON"), ui->tableWidget_CHInfo); buttonoper->setFixedSize(60, 23); auto cellWidget = new QWidget(this); auto layout = new QHBoxLayout(cellWidget); layout ->addWidget(buttonoper); cellWidget->setLayout(layout); ui->tableWidget_CHInfo->setCellWidget(i, 9, cellWidget); } } void MainWidget::InitConnect() { connect(ui->pb_Debug,SIGNAL(clicked()),this,SLOT(slot_changeDebugMode())); connect(ui->Button_checkserial,SIGNAL(clicked()),this,SLOT(on_Button_checkserial_clicked())); connect(ui->Button_openserial,SIGNAL(clicked()),this,SLOT(on_Button_openserial_clicked())); connect(ui->Button_clearrecive,SIGNAL(clicked()),this,SLOT(on_Button_clearrecive_clicked())); connect(ui->Button_tx,SIGNAL(clicked()),this,SLOT(on_Button_tx_clicked())); connect(ui->Button_cleartx,SIGNAL(clicked()),this,SLOT(on_Button_cleartx_clicked())); } void MainWidget::manual_serialPortReadyRead() { QByteArray recBuf = Data_Ctrl::getData()->serialPort->readAll();; QString str_rev; // 接收字节计数 recvNum += recBuf.size(); // 状态栏显示计数值 setNumOnLabel(lblRecvNum, "R: ", recvNum); if(ui->check_hex_recive->checkState() == false){ if(ui->check_timestamp->checkState() == Qt::Checked){ QDateTime nowtime = QDateTime::currentDateTime(); str_rev = "[" + nowtime.toString("yyyy-MM-dd hh:mm:ss") + "] "; str_rev += QString(recBuf).append("\r\n"); } else{ // 在当前位置插入文本,不会发生换行。如果没有移动光标到文件结尾,会导致文件超出当前界面显示范围,界面也不会向下滚动。 //ui->recvEdit->appendPlainText(buf); if(ui->check_changeline->checkState() == Qt::Checked){ str_rev = QString(recBuf).append("\r\n"); } else { str_rev = QString(recBuf); } } }else{ // 16进制显示,并转换为大写 QString str1 = recBuf.toHex().toUpper();//.data(); // 添加空格 QString str2; for(int i = 0; icheck_timestamp->checkState() == Qt::Checked) { QDateTime nowtime = QDateTime::currentDateTime(); str_rev = "[" + nowtime.toString("yyyy-MM-dd hh:mm:ss") + "] "; str_rev += str2.append("\r\n"); } else { if(ui->check_changeline->checkState() == Qt::Checked) str_rev += str2.append("\r\n"); else str_rev = str2; } } ui->recive_Edit->insertPlainText(str_rev); ui->recive_Edit->moveCursor(QTextCursor::End); } void MainWidget::on_Button_openserial_clicked() { if(ui->baudrate_CB->currentText()=="1200") Data_Ctrl::getData()->baudRate=QSerialPort::Baud1200; else if(ui->baudrate_CB->currentText()=="2400") Data_Ctrl::getData()->baudRate=QSerialPort::Baud2400; else if(ui->baudrate_CB->currentText()=="4800") Data_Ctrl::getData()->baudRate=QSerialPort::Baud4800; else if(ui->baudrate_CB->currentText()=="9600") Data_Ctrl::getData()->baudRate=QSerialPort::Baud9600; else if(ui->baudrate_CB->currentText()=="19200") Data_Ctrl::getData()->baudRate=QSerialPort::Baud19200; else if(ui->baudrate_CB->currentText()=="38400") Data_Ctrl::getData()->baudRate=QSerialPort::Baud38400; else if(ui->baudrate_CB->currentText()=="57600") Data_Ctrl::getData()->baudRate=QSerialPort::Baud57600; else if(ui->baudrate_CB->currentText()=="115200") Data_Ctrl::getData()->baudRate=QSerialPort::Baud115200; // 获取串口数据位 if(ui->databit_CB->currentText()=="8") Data_Ctrl::getData()->dataBits=QSerialPort::Data5; else if(ui->databit_CB->currentText()=="7") Data_Ctrl::getData()->dataBits=QSerialPort::Data6; else if(ui->databit_CB->currentText()=="6") Data_Ctrl::getData()->dataBits=QSerialPort::Data7; else if(ui->databit_CB->currentText()=="5") Data_Ctrl::getData()->dataBits=QSerialPort::Data8; // 获取串口停止位 if(ui->stopbit_CB->currentText()=="1") Data_Ctrl::getData()->stopBits=QSerialPort::OneStop; else if(ui->stopbit_CB->currentText()=="1.5") Data_Ctrl::getData()->stopBits=QSerialPort::OneAndHalfStop; else if(ui->stopbit_CB->currentText()=="2") Data_Ctrl::getData()->stopBits=QSerialPort::TwoStop; // 获取串口奇偶校验位 if(ui->checkbit_CB->currentText() == "None"){ Data_Ctrl::getData()->checkBits = QSerialPort::NoParity; }else if(ui->checkbit_CB->currentText() == "Odd"){ Data_Ctrl::getData()->checkBits = QSerialPort::OddParity; }else if(ui->checkbit_CB->currentText() == "Even"){ Data_Ctrl::getData()->checkBits = QSerialPort::EvenParity; } // 初始化串口属性,设置 端口号、波特率、数据位、停止位、奇偶校验位数 Data_Ctrl::getData()->serialPort->setPortName(ui->serialCB->currentText()); // 根据初始化好的串口属性,打开串口 // 如果打开成功,反转打开按钮显示和功能。打开失败,无变化,并且弹出错误对话框。 if(ui->Button_openserial->text() == "打开串口"){ if(m_USBCtrl.SeralPortCtrl(SeralCtrlType::Seral_Open)){ //QMessageBox:: ui->Button_openserial->setText("关闭串口"); // 让端口号下拉框不可选,避免误操作(选择功能不可用,控件背景为灰色) ui->serialCB->setEnabled(false); }else{ QMessageBox::critical(this, "错误提示", "串口打开失败!!!\r\n该串口可能被占用\r\n请选择正确的串口"); } //statusBar 状态栏显示端口状态 QString sm = "%1 OPENED, %2, 8, NONE, 1"; QString status = sm.arg(Data_Ctrl::getData()->serialPort->portName()).arg(Data_Ctrl::getData()->serialPort->baudRate()); lblPortState->setText(status); lblPortState->setStyleSheet("color:green"); }else{ m_USBCtrl.SeralPortCtrl(SeralCtrlType::Seral_Close); ui->Button_openserial->setText("打开串口"); // 端口号下拉框恢复可选,避免误操作 ui->serialCB->setEnabled(true); //statusBar 状态栏显示端口状态 QString sm = "%1 CLOSED"; QString status = sm.arg(Data_Ctrl::getData()->serialPort->portName()); lblPortState->setText(status); lblPortState->setStyleSheet("color:red"); } } /*发送数据*/ void MainWidget::on_Button_tx_clicked() { QByteArray array; //Hex复选框 if(ui->check_hexsend->checkState() == Qt::Checked){ //array = QString2Hex(data); //HEX 16进制 array = QByteArray::fromHex(ui->send_Edit->toPlainText().toUtf8()).data(); }else{ //array = data.toLatin1(); //ASCII array = ui->send_Edit->toPlainText().toLocal8Bit().data(); } if(ui->check_sendnewline->checkState() == Qt::Checked){ array.append("\r\n"); } // 如发送成功,会返回发送的字节长度。失败,返回-1。 int a = Data_Ctrl::getData()->serialPort->write(array); // 发送字节计数并显示 if(a > 0) { // 发送字节计数 sendNum += a; // 状态栏显示计数值 setNumOnLabel(lblSendNum, "S: ", sendNum); } } void MainWidget::on_Button_clearrecive_clicked() { ui->recive_Edit->clear(); // 清除发送、接收字节计数 sendNum = 0; recvNum = 0; // 状态栏显示计数值 setNumOnLabel(lblSendNum, "S: ", sendNum); setNumOnLabel(lblRecvNum, "R: ", recvNum); } void MainWidget::on_Button_cleartx_clicked() { ui->recive_Edit->clear(); // 清除发送字节计数 sendNum = 0; // 状态栏显示计数值 setNumOnLabel(lblSendNum, "S: ", sendNum); } void MainWidget::on_check_autosend_stateChanged(int arg1) { // 获取复选框状态,未选为0,选中为2 if(arg1 == 0){ timSend->stop(); // 时间输入框恢复可选 ui->spin_sendtime->setEnabled(true); }else{ // 对输入的值做限幅,小于10ms会弹出对话框提示 if(ui->spin_sendtime->text().toInt() >= 10){ timSend->start(ui->spin_sendtime->text().toInt());// 设置定时时长,重新计数 // 让时间输入框不可选,避免误操作(输入功能不可用,控件背景为灰色) ui->spin_sendtime->setEnabled(false); }else{ ui->check_autosend->setCheckState(Qt::Unchecked); QMessageBox::critical(this, "错误提示", "定时发送的最小间隔为 10ms\r\n请确保输入的值 >=10"); } } } void MainWidget::on_Button_checkserial_clicked() { ui->serialCB->clear(); //通过QSerialPortInfo查找可用串口 foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { ui->serialCB->addItem(info.portName()); } } void MainWidget::slot_changeDebugMode() { int nIndex=ui->stackedWidget->currentIndex(); if(nIndex<2) { ui->stackedWidget->setCurrentIndex(2); }else { ui->stackedWidget->setCurrentIndex(1); } } void MainWidget::setNumOnLabel(QLabel *lbl, QString strS, long num) { // 标签显示 QString strN; strN.sprintf("%ld", num); QString str = strS + strN; lbl->setText(str); } void MainWidget::on_pushButton_L1_clicked() { m_CurPhase=1; ui->pushButton_L1->setIcon(QIcon("resource/Started.png")); ui->pushButton_L2->setIcon(QIcon("resource/Reset.png")); ui->pushButton_L3->setIcon(QIcon("resource/Reset.png")); } void MainWidget::on_pushButton_L2_clicked() { m_CurPhase=2; ui->pushButton_L1->setIcon(QIcon("resource/Reset.png")); ui->pushButton_L2->setIcon(QIcon("resource/Started.png")); ui->pushButton_L3->setIcon(QIcon("resource/Reset.png")); } void MainWidget::on_pushButton_L3_clicked() { m_CurPhase=3; ui->pushButton_L1->setIcon(QIcon("resource/Reset.png")); ui->pushButton_L2->setIcon(QIcon("resource/Reset.png")); ui->pushButton_L3->setIcon(QIcon("resource/Started.png")); } void MainWidget::on_pushButton_ALLOPEN_clicked() { QMessageBox::StandardButton confimBtn = QMessageBox::question(this, "确认", "是否打开全部通道?", QMessageBox::Ok | QMessageBox::Cancel); if (confimBtn == QMessageBox::Cancel) { return; } else { return; } } void MainWidget::on_pushButton_ALLCLOSE_clicked() { QMessageBox::StandardButton confimBtn = QMessageBox::question(this, "确认", "是否关闭全部通道?", QMessageBox::Ok | QMessageBox::Cancel); if (confimBtn == QMessageBox::Cancel) { return; } else { return; } } void MainWidget::UpdateStatusInfo() { QString strTemp; //更新传感器 strTemp.sprintf("%0.2f", m_PDUAllInfo.Sensor_Temperature); ui->label_temperature->setText(strTemp); strTemp.sprintf("%0.2f", m_PDUAllInfo.Sensor_Humidity); ui->label_humidity->setText(strTemp); strTemp.sprintf("%0.2f", m_PDUAllInfo.Sensor_WaterImmersion);//水浸温度 //ui->label_temperature->setText(strTemp); strTemp.sprintf("%0.2f", m_PDUAllInfo.Sensor_INTemperature);//进液温度 //ui->label_humidity->setText(strTemp); strTemp.sprintf("%0.2f", m_PDUAllInfo.Sensor_OUTTemperature);//出液温度 // ui->label_humidity->setText(strTemp); //更新总体电源状态 if(1==m_CurPhase) { strTemp.sprintf("%0.3f", m_PDUAllInfo.AllPower_L1); ui->lineEdit_TotalPower->setText(strTemp); strTemp.sprintf("%0.3f", m_PDUAllInfo.AllConsumption_L1); ui->lineEdit_TotalConsumption->setText(strTemp); } else if(2==m_CurPhase) { strTemp.sprintf("%0.3f", m_PDUAllInfo.AllPower_L2); ui->lineEdit_TotalPower->setText(strTemp); strTemp.sprintf("%0.3f", m_PDUAllInfo.AllConsumption_L2); ui->lineEdit_TotalConsumption->setText(strTemp); } else if(3==m_CurPhase) { strTemp.sprintf("%0.3f", m_PDUAllInfo.AllPower_L3); ui->lineEdit_TotalPower->setText(strTemp); strTemp.sprintf("%0.3f", m_PDUAllInfo.AllConsumption_L3); ui->lineEdit_TotalConsumption->setText(strTemp); } //更新通道信息 for (int i=0;i<64;i++) { m_PDUCHInfo[i].CHVoltage+=0.432; m_PDUCHInfo[i].CHPower+=0.343; m_PDUCHInfo[i].CHCurrent+=0.112; m_PDUCHInfo[i].CHConsumption+=0.063; m_PDUCHInfo[i].CHFactor=0.983; m_PDUCHInfo[i].CHStatus=true; } InitCHTable(m_TotalCHNum,false); }