14.Qt使用QSerialPort实现串口调试助手

Qt使用QSerialPort实现串口调试助手

QSerialPort用于操作串口,如监听哪个串口、波特率、校验位、停止位、数据位等。

.pro需要增加serialport

QT       += core gui serialport

headers

customthread.h

#ifndef CUSTOMTHREAD_H
#define CUSTOMTHREAD_H

#include <QThread>
#include <QWidget>

class CustomThread : public QThread
{
    Q_OBJECT
public:
    CustomThread(QWidget *parent);
protected:
    void run() override;
signals:
    void threadTimeOut();
};

#endif // CUSTOMTHREAD_H

mycombobox.h

#ifndef MYCOMBOBOX_H
#define MYCOMBOBOX_H

#include <QComboBox>
#include <QWidget>

class MyComboBox : public QComboBox
{
    Q_OBJECT
public:
    MyComboBox(QWidget *parent);
protected:
    void mousePressEvent(QMouseEvent *e) override;
signals:
    void refresh();
};

#endif // MYCOMBOBOX_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include "customthread.h"

#include <QCheckBox>
#include <QLineEdit>
#include <QPushButton>
#include <QSerialPort>
#include <QTimer>
#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private:
    QSerialPort *serialPort;

private slots:
    void on_btnSerailChange_clicked();
    void on_btnSend_clicked();
    void on_serialPort_readToRead();
    void on_checkBox_SendTimer_clicked(bool checked);
    void on_btnReceiveClear_clicked();
    void on_btnReceiveSave_clicked();
    void on_checkBox_receiveTime_clicked(bool checked);
    void sysTimeSecend();
    void getCurrentTime();
    void on_checkBox_hexShow_clicked(bool checked);
    void on_btnHidePanel_clicked(bool checked);
    void on_btnHideHistory_clicked(bool checked);
    void refreshSerialName();

    void on_command_button_clicked();
//    void on_pushButton_1_clicked();
//    void on_pushButton_2_clicked();
//    void on_pushButton_3_clicked();
//    void on_pushButton_4_clicked();
//    void on_pushButton_5_clicked();
//    void on_pushButton_6_clicked();
//    void on_pushButton_7_clicked();
//    void on_pushButton_8_clicked();
//    void on_pushButton_9_clicked();
    void on_checkBox_sendRound_clicked(bool checked);
    void button_handle();
    void on_btnReset_clicked();

    void on_btnSave_clicked();

    void on_btnOpen_clicked();

private:
    Ui::Widget *ui;
    int writeCntTotal;
    int readCntTotal;
    QString sendHistory;
    bool serialStatus = false;
    QTimer *timer;
    QTimer *timerOneSend;
    bool dateShowStatus = false;
    QString currentDateString;
    QList<QPushButton *> buttons;
    QList<QLineEdit *> lineEdits;
    QList<QCheckBox *> checkBoxs;
    QTimer *buttonsHandleTimer;
    int buttonIndex = 0;
    CustomThread *buttonsThread;
};
#endif // WIDGET_H

sources

customthread.cpp

#include "customthread.h"

CustomThread::CustomThread(QWidget *parent):QThread(parent)
{

}

void CustomThread::run()
{
    while (true) {
        msleep(1000);
        emit threadTimeOut();
    }
}

mycombobox.cpp

#include "mycombobox.h"

#include <QMouseEvent>

MyComboBox::MyComboBox(QWidget *parent):QComboBox(parent)
{

}

void MyComboBox::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::LeftButton)
    {
        emit refresh();
    }
    QComboBox::mousePressEvent(e);
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "customthread.h"

#include <QCoreApplication>
#include <QDateTime>
#include <QFileDialog>
#include <QMessageBox>
#include <QMessageBox>
#include <QSerialPortInfo>
#include <QThread>
#include "QDebug"
#include "mycombobox.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //gridLayoutGlobal布局自适应窗口大小
    this->setLayout(ui->gridLayoutGlobal);

    //创建
    serialPort = new QSerialPort(this);
    timer = new QTimer(this);
    timerOneSend = new QTimer(this);
    //buttonsHandleTimer = new QTimer(this);

    ui->comboBox_baudRate->setCurrentIndex(6);
    ui->comboBox_dataBits->setCurrentIndex(3);
    ui->btnSend->setDisabled(true);
    ui->lineEditTimer->setDisabled(true);
    ui->checkBox_SendTimer->setDisabled(true);
    ui->checkBox_sendHEX->setDisabled(true);
    ui->checkBox_sendNewLine->setDisabled(true);
    ui->checkBox_formatInput->setDisabled(true);

    //绑定QSerialPort::readyRead的信号与槽,用于读取数据
    connect(serialPort,&QSerialPort::readyRead,this,&Widget::on_serialPort_readToRead);
    //绑定定时器,用于定时发送数据
    connect(timer,&QTimer::timeout,this,&Widget::on_btnSend_clicked);
    //绑定定时器,用于刷新系统时间
    connect(timerOneSend,&QTimer::timeout,[=](){
        sysTimeSecend();
    });
    //connect(buttonsHandleTimer,&QTimer::timeout,this,&Widget::button_handle);
    //模拟多线程定时发送指令
    buttonsThread = new CustomThread(this);
    connect(buttonsThread,&CustomThread::threadTimeOut,this,&Widget::button_handle);
    //绑定MyComboBox::refresh,用于新设备进来刷新
    connect(ui->comboBox_serialNum,&MyComboBox::refresh,this,&Widget::refreshSerialName);

    //启动定时器
    timerOneSend->start(1000);
    refreshSerialName();

    //将重复操作业务的按钮放入checkBoxs列表中
    for (int i = 1; i <= 9; i++) {
        QString btnName = QString("pushButton_%1").arg(i);
        QPushButton* btn = findChild<QPushButton *>(btnName);
        if(btn) {
            btn->setProperty("buttonId",i);
            buttons.append(btn);
            connect(btn,SIGNAL(clicked()),this,SLOT(on_command_button_clicked()));
        }
        QString lintEditString = QString("lineEdit_%1").arg(i);
        QLineEdit *lintEdit = findChild<QLineEdit *>(lintEditString);
        lineEdits.append(lintEdit);
        QString checkBoxString = QString("checkBox_%1").arg(i);
        QCheckBox *checkBox = findChild<QCheckBox *>(checkBoxString);
        checkBoxs.append(checkBox);
    }
}

Widget::~Widget()
{
    delete ui;
}

//串口连接
void Widget::on_btnSerailChange_clicked()
{
    if(!serialStatus){
        //1.设置串口
        serialPort->setPortName(ui->comboBox_serialNum->currentText());
        //2.设置波特率
        serialPort->setBaudRate(ui->comboBox_baudRate->currentText().toInt());
        //3.设置数据位
        serialPort->setDataBits(QSerialPort::DataBits
                                (ui->comboBox_dataBits->currentText().toUInt()));
        //4.设置校验位
        switch (ui->comboBox_verifyBits->currentIndex()) {
        case 0:
            serialPort->setParity(QSerialPort::NoParity);
            break;
        case 1:
            serialPort->setParity(QSerialPort::EvenParity);
            break;
        case 2:
            serialPort->setParity(QSerialPort::MarkParity);
            break;
        case 3:
            serialPort->setParity(QSerialPort::OddParity);
            break;
        case 4:
            serialPort->setParity(QSerialPort::SpaceParity);
            break;
        default:
            serialPort->setParity(QSerialPort::UnknownParity);
        }
        //5.设置停止位
        serialPort->setStopBits(QSerialPort::StopBits
                                (ui->comboBox_stopBits->currentText().toUInt()));
        //6.设置流控
        if(ui->comboBox_streamContrl->currentText() == "None")
            serialPort->setFlowControl(QSerialPort::NoFlowControl);
        //7.打开串口
        if(serialPort->open(QIODevice::ReadWrite))
        {
            //qDebug() << "success open serial";
            ui->btnSerailChange->setText("关闭串口");
            ui->comboBox_serialNum->setDisabled(true);
            ui->comboBox_baudRate->setDisabled(true);
            ui->comboBox_dataBits->setDisabled(true);
            ui->comboBox_verifyBits->setDisabled(true);
            ui->comboBox_stopBits->setDisabled(true);
            ui->comboBox_streamContrl->setDisabled(true);
            serialStatus = true;
            ui->btnSend->setDisabled(false);
            ui->lineEditTimer->setDisabled(false);
            ui->checkBox_SendTimer->setDisabled(false);
            ui->checkBox_sendHEX->setDisabled(false);
            ui->checkBox_sendNewLine->setDisabled(false);
            ui->checkBox_formatInput->setDisabled(false);
        }else
        {
            QMessageBox msgBox;
            msgBox.setText("串口可能被占用,或设备被拔出");
            msgBox.exec();
        }
    }else{
        serialPort->close();
        ui->btnSerailChange->setText("打开串口");
        ui->comboBox_serialNum->setDisabled(false);
        ui->comboBox_baudRate->setDisabled(false);
        ui->comboBox_dataBits->setDisabled(false);
        ui->comboBox_verifyBits->setDisabled(false);
        ui->comboBox_stopBits->setDisabled(false);
        ui->comboBox_streamContrl->setDisabled(false);
        serialStatus = false;
        ui->btnSend->setDisabled(true);
        ui->lineEditTimer->setDisabled(true);
        ui->checkBox_SendTimer->setDisabled(true);
        ui->checkBox_sendHEX->setDisabled(true);
        ui->checkBox_sendNewLine->setDisabled(true);
        ui->checkBox_formatInput->setDisabled(true);
        ui->checkBox_SendTimer->setCheckState(Qt::Unchecked);
        timer->stop();
    }
}

//发送数据
void Widget::on_btnSend_clicked()
{
    int writeCnt = 0;
    //    std::string stringContext = ui->lineEditSendContext->text().toStdString();
    //    const char* sendData = stringContext.c_str();
    const char* sendData = ui->lineEditSendContext->text().toLocal8Bit().constData();
    //    QString  strContext = ui->lineEditSendContext->text();
    //    const char* sendData = strContext.toLocal8Bit().constData();

    //发送hex格式判断
    if(ui->checkBox_sendHEX->isChecked()){
        QString tmpString  = ui->lineEditSendContext->text();

        QByteArray tmpArray = tmpString.toLocal8Bit();
        //1.判断是否是偶数位
        if(tmpArray.size()%2 !=0 ){
            ui->labelSendStatus->setText("Error Input!");
            return;
        }
        //2.判断是否合法
        for(char c : tmpArray){
            if(!std::isxdigit(c)){
                ui->labelSendStatus->setText("Error Input!");
                return;
            }
        }
        //3.转换成16进制发送正确的1
        if(ui->checkBox_sendNewLine->isChecked()){
            tmpArray.append("\r\n");
        }
        QByteArray qbArray = QByteArray::fromHex(tmpArray);
        //写入数据
        writeCnt = serialPort->write(qbArray);
    }else{//1.如果不是16进制
        //发送新行
        if(ui->checkBox_sendNewLine->isChecked()){
            QByteArray arraySend(sendData,strlen(sendData));
            arraySend.append("\r\n");
            writeCnt = serialPort->write(arraySend);
        }else{
            writeCnt = serialPort->write(sendData);
        }
    }
    if(writeCnt == -1){
        ui->labelSendStatus->setText("SendError");
    }else{
        writeCntTotal += writeCnt;
        //qDebug() << "SendOK" << sendData;
        ui->labelSendStatus->setText("SendOk");
        ui->labelSendCnt->setText("Send:"+QString::number(writeCntTotal));
        if(strcmp(sendData,sendHistory.toStdString().c_str()) != 0)
        {
            ui->textEditRecord->append(sendData);
            sendHistory = QString(sendData);
        }
    }
}

//读取串口数据
void Widget::on_serialPort_readToRead()
{
    QString receiveMsg = serialPort->readAll();
    if(receiveMsg != NULL) {
        if(ui->checkBox_autoNextLine->isChecked()) receiveMsg.append("\r\n");
        //16进制显示
        if(ui->checkBox_hexShow->isChecked()){
            QByteArray tmpHexString = receiveMsg.toUtf8().toHex().toUpper();
            //原来的数据
            QString tmpString = ui->textEditReceive->toPlainText();
            tmpHexString = tmpString.toUtf8()+tmpHexString;
            ui->textEditReceive->setText(QString::fromUtf8(tmpHexString));
            //qDebug() << "ReceiveOK HEX: "<< receiveMsg;
        }else{
            //qDebug() << "ReceiveOK: "<< receiveMsg;
            if(dateShowStatus){
                ui->textEditReceive->insertPlainText("【"+currentDateString+"】"+receiveMsg);
            }else{
                ui->textEditReceive->insertPlainText(receiveMsg);
            }
        }
        readCntTotal += receiveMsg.size();
        ui->labelReceiveCnt->setText("Received:"+QString::number(readCntTotal));
    }
    ui->textEditReceive->moveCursor(QTextCursor::End);
    ui->textEditReceive->ensureCursorVisible();
    //ui->textEditReceive->setFocus();
}

//定时发送
void Widget::on_checkBox_SendTimer_clicked(bool checked)
{
    //qDebug() << checked;
    if(checked){
        timer->start( ui->lineEditTimer->text().toInt());
        ui->lineEditTimer->setDisabled(true);
        ui->lineEditSendContext->setDisabled(true);
        //on_btnSend_clicked();
    }else{
        timer->stop();
        ui->lineEditTimer->setDisabled(false);
        ui->lineEditSendContext->setDisabled(false);
    }
}

void Widget::on_btnReceiveClear_clicked()
{
    ui->textEditReceive->setText("");
}

//接收数据保存
void Widget::on_btnReceiveSave_clicked()
{
    QString fileName = QFileDialog::getSaveFileName(this,tr("save Receive"),
                                                    "/home",
                                                    tr("Text (*.txt)"));
    if(fileName != NULL){
        QFile file(fileName);
        if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
            return;
        QTextStream out(&file);
        //out.setCodec("UTF-8");
        out << ui->textEditReceive->toPlainText();
        file.close();
    }
}

void Widget::on_checkBox_receiveTime_clicked(bool checked)
{
    dateShowStatus = checked;
}
//定时发送
void Widget::sysTimeSecend()
{
    getCurrentTime();
    ui->labelCurrentTime->setText(currentDateString);
}
//获取当前时间
void Widget::getCurrentTime()
{
    QDateTime dateTime = QDateTime::currentDateTime();
    QDate date = dateTime.date();
    int year = date.year();
    int month = date.month();
    int day = date.day();
    QTime time = dateTime.time();
    int hour = time.hour();
    int minute = time.minute();
    int second = time.second();

    currentDateString = QString("%1-%2-%3 %4:%5:%6")
            .arg(year,2,10,QChar('0'))
            .arg(month,2,10,QChar('0'))
            .arg(day,2,10,QChar('0'))
            .arg(hour,2,10,QChar('0'))
            .arg(minute,2,10,QChar('0'))
            .arg(second,2,10,QChar('0'));
}
//hex格式显示
void Widget::on_checkBox_hexShow_clicked(bool checked)
{
    if(checked){
        //1.读取textedit文本
        QString temp = ui->textEditReceive->toPlainText();
        //2.转换hex
        QByteArray batmep = temp.toUtf8();
        batmep = batmep.toHex();
        //3.回写textedit文本
        QString lastShow;
        temp = QString::fromUtf8(batmep);
        for (int i = 0; i < temp.size(); i+=2) {
            lastShow += temp.mid(i,2)+ " ";
        }
        ui->textEditReceive->setText(lastShow.toUpper());
    }else{
        //1.读取textedit文本
        QString temp = ui->textEditReceive->toPlainText();
        //2.转换qstring
        QByteArray batmep = temp.toUtf8();
        batmep = QByteArray::fromHex(batmep);
        //3.回写textedit文本
        ui->textEditReceive->setText(QString::fromUtf8(batmep));
    }
}

void Widget::on_btnHidePanel_clicked(bool checked)
{
    if(checked){
        ui->btnHidePanel->setText("扩展面板");
        ui->groupBoxTexts->hide();

    }else{
        ui->btnHidePanel->setText("隐藏面板");
        ui->groupBoxTexts->show();
    }
}
void Widget::on_btnHideHistory_clicked(bool checked)
{
    if(checked){
        ui->btnHideHistory->setText("显示历史");
        ui->groupBoxHistory->hide();

    }else{
        ui->btnHideHistory->setText("隐藏历史");
        ui->groupBoxHistory->show();
    }
}
void Widget::refreshSerialName()
{
    ui->comboBox_serialNum->clear();
    QList<QSerialPortInfo> serialList = QSerialPortInfo::availablePorts();
    for(QSerialPortInfo qSerialPort : serialList){
        //qDebug() << qSerialPort.portName();
        ui->comboBox_serialNum->addItem(qSerialPort.portName());
    }
    ui->labelSendStatus->setText("Com Refreshed!");
}

void Widget::on_command_button_clicked()
{
    QPushButton *btn = qobject_cast<QPushButton *>(sender());
    if(btn){
        int num = btn->property("buttonId").toInt();
        //qDebug() << num;
        QString lintEditString = QString("lineEdit_%1").arg(num);
        QLineEdit *lintEdit = findChild<QLineEdit *>(lintEditString);
        if(lintEdit){
            if(lintEdit->text().size() <= 0) return;
            ui->lineEditSendContext->setText(lintEdit->text());
        }
        QString checkBoxString = QString("checkBox_%1").arg(num);
        QCheckBox *checkBox = findChild<QCheckBox *>(checkBoxString);
        if(checkBox)
            ui->checkBox_sendHEX->setChecked(checkBox->isChecked());
        on_btnSend_clicked();
    }
}

void Widget::button_handle()
{
    if(buttonIndex < buttons.size())
    {
        QPushButton *btn =  buttons[buttonIndex];
        emit btn->clicked();
        buttonIndex++;
    }else{
        buttonIndex = 0;
    }
}

void Widget::on_checkBox_sendRound_clicked(bool checked)
{
    if(checked)
    {
        buttonsThread->start();
    }else{
        buttonsThread->terminate();
    }
}

void Widget::on_btnReset_clicked()
{
    QMessageBox msgBox;
    msgBox.setWindowTitle("提示");
    msgBox.setIcon(QMessageBox::Question);
    msgBox.setText("重置列表不可逆,确认是否重置");
    QPushButton *yesButton = msgBox.addButton("是",QMessageBox::YesRole);
    QPushButton *noButton = msgBox.addButton("否",QMessageBox::NoRole);
    msgBox.exec();
    if(msgBox.clickedButton() == yesButton){
        //1.遍历清空
        for (int i  = 0; i < lineEdits.size(); i++) {
            lineEdits[i]->clear();
            checkBoxs[i]->setChecked(false);
        }
        //qDebug() << "yesButton";
    }
    if(msgBox.clickedButton() == noButton) {
        //qDebug() << "noButton";
    }
}

void Widget::on_btnSave_clicked()
{
    QString fileName = QFileDialog::getSaveFileName(this, tr("保存文件"), "E:/",tr("文本类型 (*.txt)"));
    QFile file(fileName);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
        return;
    QTextStream out(&file);
    for (int i = 0; i < lineEdits.size(); i++) {
        out << checkBoxs[i]->isChecked()<<"|"<<lineEdits[i]->text() << "\n";
    }
    file.close();
}

void Widget::on_btnOpen_clicked()
{
    int i = 0;
    QString fileName = QFileDialog::getOpenFileName(this, tr("打开文件"),"E:/",tr("文本类型 (*.txt)"));
    if(fileName != NULL){
        QFile file(fileName);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
            return;
        QTextStream in(&file);
        while(!in.atEnd() && i <= 9){
            QString line = in.readLine();
            QStringList qListStr = line.split("|");
            if(qListStr.count() == 2){
                checkBoxs[i]->setChecked(qListStr[0].toInt());
                lineEdits[i]->setText(qListStr[1]);
            }
            i++;
        }
        file.close();
    }
}

UI

widget.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>683</width>
    <height>576</height>
   </rect>
  </property>
  <property name="minimumSize">
   <size>
    <width>0</width>
    <height>0</height>
   </size>
  </property>
  <property name="sizeIncrement">
   <size>
    <width>20</width>
    <height>0</height>
   </size>
  </property>
  <property name="baseSize">
   <size>
    <width>0</width>
    <height>0</height>
   </size>
  </property>
  <property name="windowTitle">
   <string>大雄串口调试助手1.0</string>
  </property>
  <property name="windowIcon">
   <iconset resource="res.qrc">
    <normaloff>:/mianicon.png</normaloff>:/mianicon.png</iconset>
  </property>
  <widget class="QWidget" name="layoutWidget">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>0</y>
     <width>821</width>
     <height>627</height>
    </rect>
   </property>
   <layout class="QGridLayout" name="gridLayoutGlobal">
    <item row="1" column="0">
     <widget class="QGroupBox" name="groupBoxMiddle">
      <property name="title">
       <string/>
      </property>
      <layout class="QGridLayout" name="gridLayout_6">
       <item row="0" column="1">
        <widget class="QGroupBox" name="groupBoxStatus">
         <property name="title">
          <string/>
         </property>
         <layout class="QGridLayout" name="gridLayout_5">
          <item row="0" column="0" rowspan="4">
           <widget class="QPushButton" name="btnSerailChange">
            <property name="minimumSize">
             <size>
              <width>0</width>
              <height>50</height>
             </size>
            </property>
            <property name="maximumSize">
             <size>
              <width>80</width>
              <height>16777215</height>
             </size>
            </property>
            <property name="text">
             <string>打开串口</string>
            </property>
           </widget>
          </item>
          <item row="2" column="4">
           <widget class="QPushButton" name="btnModeDown">
            <property name="text">
             <string>下载模式</string>
            </property>
           </widget>
          </item>
          <item row="1" column="4">
           <widget class="QPushButton" name="btnModeRun">
            <property name="text">
             <string>运行模式</string>
            </property>
           </widget>
          </item>
          <item row="1" column="3">
           <widget class="QCheckBox" name="checkBox_hexShow">
            <property name="text">
             <string>HEX显示</string>
            </property>
           </widget>
          </item>
          <item row="2" column="3">
           <widget class="QCheckBox" name="checkBox_autoNextLine">
            <property name="text">
             <string>自动换行</string>
            </property>
           </widget>
          </item>
          <item row="2" column="1">
           <widget class="QPushButton" name="btnReceiveSave">
            <property name="text">
             <string>保存接收</string>
            </property>
           </widget>
          </item>
          <item row="1" column="6">
           <widget class="QPushButton" name="btnHidePanel">
            <property name="text">
             <string>隐藏面板</string>
            </property>
            <property name="checkable">
             <bool>true</bool>
            </property>
           </widget>
          </item>
          <item row="2" column="6">
           <widget class="QPushButton" name="btnHideHistory">
            <property name="text">
             <string>隐藏历史</string>
            </property>
            <property name="checkable">
             <bool>true</bool>
            </property>
           </widget>
          </item>
          <item row="1" column="2">
           <widget class="QCheckBox" name="checkBox_receiveTime">
            <property name="text">
             <string>接收时间</string>
            </property>
           </widget>
          </item>
          <item row="1" column="1">
           <widget class="QPushButton" name="btnReceiveClear">
            <property name="text">
             <string>清空接收</string>
            </property>
           </widget>
          </item>
         </layout>
        </widget>
       </item>
       <item row="0" column="0" rowspan="2">
        <widget class="QGroupBox" name="groupBoxSelect">
         <property name="title">
          <string/>
         </property>
         <layout class="QGridLayout" name="gridLayout_3">
          <item row="3" column="0">
           <layout class="QHBoxLayout" name="horizontalLayout_verifyBits">
            <item>
             <widget class="QLabel" name="label_7">
              <property name="text">
               <string>校验位</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QComboBox" name="comboBox_verifyBits">
              <property name="minimumSize">
               <size>
                <width>90</width>
                <height>0</height>
               </size>
              </property>
              <property name="maximumSize">
               <size>
                <width>90</width>
                <height>16777215</height>
               </size>
              </property>
              <item>
               <property name="text">
                <string>None</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>Even</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>Mark</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>Odd</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>Space</string>
               </property>
              </item>
             </widget>
            </item>
           </layout>
          </item>
          <item row="4" column="0">
           <layout class="QHBoxLayout" name="horizontalLayout_stopBits">
            <item>
             <widget class="QLabel" name="label_9">
              <property name="text">
               <string>停止位</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QComboBox" name="comboBox_stopBits">
              <property name="minimumSize">
               <size>
                <width>90</width>
                <height>0</height>
               </size>
              </property>
              <property name="maximumSize">
               <size>
                <width>90</width>
                <height>16777215</height>
               </size>
              </property>
              <item>
               <property name="text">
                <string>One</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>OnePointFive</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>Two</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>None</string>
               </property>
              </item>
             </widget>
            </item>
           </layout>
          </item>
          <item row="2" column="0">
           <layout class="QHBoxLayout" name="horizontalLayout_dataBits">
            <item>
             <widget class="QLabel" name="label_10">
              <property name="text">
               <string>数据位</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QComboBox" name="comboBox_dataBits">
              <property name="minimumSize">
               <size>
                <width>90</width>
                <height>0</height>
               </size>
              </property>
              <property name="maximumSize">
               <size>
                <width>90</width>
                <height>16777215</height>
               </size>
              </property>
              <item>
               <property name="text">
                <string>5</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>6</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>7</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>8</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>None</string>
               </property>
              </item>
             </widget>
            </item>
           </layout>
          </item>
          <item row="0" column="0">
           <layout class="QHBoxLayout" name="horizontalLayout_serialNum">
            <item>
             <widget class="QLabel" name="label_5">
              <property name="text">
               <string>串口</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="MyComboBox" name="comboBox_serialNum">
              <property name="minimumSize">
               <size>
                <width>90</width>
                <height>0</height>
               </size>
              </property>
              <property name="maximumSize">
               <size>
                <width>90</width>
                <height>16777215</height>
               </size>
              </property>
             </widget>
            </item>
           </layout>
          </item>
          <item row="5" column="0">
           <layout class="QHBoxLayout" name="horizontalLayout_streamContrl">
            <item>
             <widget class="QLabel" name="label_8">
              <property name="text">
               <string>流控</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QComboBox" name="comboBox_streamContrl">
              <property name="minimumSize">
               <size>
                <width>90</width>
                <height>0</height>
               </size>
              </property>
              <property name="maximumSize">
               <size>
                <width>90</width>
                <height>16777215</height>
               </size>
              </property>
              <item>
               <property name="text">
                <string>No</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>Soft</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>Hard</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>None</string>
               </property>
              </item>
             </widget>
            </item>
           </layout>
          </item>
          <item row="1" column="0">
           <layout class="QHBoxLayout" name="horizontalLayout__baudRate">
            <item>
             <widget class="QLabel" name="label_6">
              <property name="text">
               <string>波特率</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QComboBox" name="comboBox_baudRate">
              <property name="minimumSize">
               <size>
                <width>90</width>
                <height>0</height>
               </size>
              </property>
              <property name="maximumSize">
               <size>
                <width>90</width>
                <height>16777215</height>
               </size>
              </property>
              <item>
               <property name="text">
                <string>4800</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>9600</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>19200</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>38400</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>57600</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>74880</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>115200</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>230400</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>460800</string>
               </property>
              </item>
              <item>
               <property name="text">
                <string>576000</string>
               </property>
              </item>
             </widget>
            </item>
           </layout>
          </item>
         </layout>
        </widget>
       </item>
       <item row="1" column="1">
        <widget class="QGroupBox" name="groupBoxSend">
         <property name="title">
          <string/>
         </property>
         <layout class="QGridLayout" name="gridLayout_7">
          <item row="0" column="0">
           <layout class="QHBoxLayout" name="horizontalLayout_22">
            <item>
             <widget class="QCheckBox" name="checkBox_SendTimer">
              <property name="text">
               <string>定时发送</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QLineEdit" name="lineEditTimer">
              <property name="maximumSize">
               <size>
                <width>60</width>
                <height>16777215</height>
               </size>
              </property>
              <property name="text">
               <string>1000</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QLabel" name="label_17">
              <property name="text">
               <string>ms/次</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QCheckBox" name="checkBox_sendNewLine">
              <property name="text">
               <string>发送新行</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QCheckBox" name="checkBox_sendHEX">
              <property name="text">
               <string>HEX发送</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QCheckBox" name="checkBox_formatInput">
              <property name="text">
               <string>格式输入</string>
              </property>
             </widget>
            </item>
           </layout>
          </item>
          <item row="1" column="0">
           <layout class="QHBoxLayout" name="horizontalLayout_23">
            <item>
             <widget class="QPushButton" name="btnSend">
              <property name="text">
               <string>发送</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QLineEdit" name="lineEditSendContext">
              <property name="text">
               <string>welcome use my serail</string>
              </property>
             </widget>
            </item>
           </layout>
          </item>
         </layout>
        </widget>
       </item>
      </layout>
     </widget>
    </item>
    <item row="2" column="0">
     <layout class="QHBoxLayout" name="horizontalLayoutFollow">
      <property name="leftMargin">
       <number>5</number>
      </property>
      <property name="bottomMargin">
       <number>10</number>
      </property>
      <item>
       <widget class="QLabel" name="labelSendStatus">
        <property name="text">
         <string>Not Connected</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QLabel" name="labelReceiveCnt">
        <property name="text">
         <string>Received:0</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QLabel" name="labelSendCnt">
        <property name="text">
         <string>Send:0</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QLabel" name="labelCurrentTime">
        <property name="text">
         <string>2025-04-29 16:36:06</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
    <item row="0" column="0">
     <layout class="QHBoxLayout" name="horizontalLayoutHead" stretch="6,5,2">
      <item>
       <widget class="QGroupBox" name="groupBoxReceive">
        <property name="title">
         <string>接收</string>
        </property>
        <layout class="QGridLayout" name="gridLayout">
         <item row="0" column="0">
          <widget class="QTextEdit" name="textEditReceive"/>
         </item>
        </layout>
       </widget>
      </item>
      <item>
       <widget class="QGroupBox" name="groupBoxHistory">
        <property name="title">
         <string>历史记录</string>
        </property>
        <layout class="QGridLayout" name="gridLayout_2">
         <item row="0" column="0">
          <widget class="QTextEdit" name="textEditRecord"/>
         </item>
        </layout>
       </widget>
      </item>
      <item>
       <widget class="QGroupBox" name="groupBoxTexts">
        <property name="enabled">
         <bool>true</bool>
        </property>
        <property name="title">
         <string>多文本</string>
        </property>
        <layout class="QVBoxLayout" name="verticalLayout">
         <item>
          <layout class="QHBoxLayout" name="horizontalLayoutLabel" stretch="2,3,0">
           <property name="leftMargin">
            <number>0</number>
           </property>
           <property name="rightMargin">
            <number>0</number>
           </property>
           <item>
            <widget class="QLabel" name="label">
             <property name="text">
              <string>HEX</string>
             </property>
            </widget>
           </item>
           <item>
            <widget class="QLabel" name="label_2">
             <property name="text">
              <string>字符串</string>
             </property>
            </widget>
           </item>
           <item>
            <widget class="QLabel" name="label_3">
             <property name="text">
              <string>发送</string>
             </property>
            </widget>
           </item>
          </layout>
         </item>
         <item>
          <layout class="QVBoxLayout" name="verticalLayoutRealText">
           <item>
            <layout class="QHBoxLayout" name="horizontalLayout_1" stretch="0,0,0">
             <property name="spacing">
              <number>6</number>
             </property>
             <property name="leftMargin">
              <number>0</number>
             </property>
             <property name="rightMargin">
              <number>0</number>
             </property>
             <item>
              <widget class="QCheckBox" name="checkBox_1">
               <property name="text">
                <string/>
               </property>
              </widget>
             </item>
             <item>
              <widget class="QLineEdit" name="lineEdit_1"/>
             </item>
             <item>
              <widget class="QPushButton" name="pushButton_1">
               <property name="minimumSize">
                <size>
                 <width>35</width>
                 <height>23</height>
                </size>
               </property>
               <property name="maximumSize">
                <size>
                 <width>25</width>
                 <height>16777215</height>
                </size>
               </property>
               <property name="baseSize">
                <size>
                 <width>25</width>
                 <height>0</height>
                </size>
               </property>
               <property name="text">
                <string>1</string>
               </property>
              </widget>
             </item>
            </layout>
           </item>
           <item>
            <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,0,0">
             <property name="spacing">
              <number>6</number>
             </property>
             <property name="leftMargin">
              <number>0</number>
             </property>
             <property name="rightMargin">
              <number>0</number>
             </property>
             <item>
              <widget class="QCheckBox" name="checkBox_2">
               <property name="text">
                <string/>
               </property>
              </widget>
             </item>
             <item>
              <widget class="QLineEdit" name="lineEdit_2"/>
             </item>
             <item>
              <widget class="QPushButton" name="pushButton_2">
               <property name="minimumSize">
                <size>
                 <width>35</width>
                 <height>23</height>
                </size>
               </property>
               <property name="maximumSize">
                <size>
                 <width>25</width>
                 <height>16777215</height>
                </size>
               </property>
               <property name="baseSize">
                <size>
                 <width>25</width>
                 <height>0</height>
                </size>
               </property>
               <property name="text">
                <string>2</string>
               </property>
              </widget>
             </item>
            </layout>
           </item>
           <item>
            <layout class="QHBoxLayout" name="horizontalLayout_3" stretch="0,0,0">
             <property name="spacing">
              <number>6</number>
             </property>
             <property name="leftMargin">
              <number>0</number>
             </property>
             <property name="rightMargin">
              <number>0</number>
             </property>
             <item>
              <widget class="QCheckBox" name="checkBox_3">
               <property name="text">
                <string/>
               </property>
              </widget>
             </item>
             <item>
              <widget class="QLineEdit" name="lineEdit_3"/>
             </item>
             <item>
              <widget class="QPushButton" name="pushButton_3">
               <property name="minimumSize">
                <size>
                 <width>35</width>
                 <height>23</height>
                </size>
               </property>
               <property name="maximumSize">
                <size>
                 <width>25</width>
                 <height>16777215</height>
                </size>
               </property>
               <property name="baseSize">
                <size>
                 <width>25</width>
                 <height>0</height>
                </size>
               </property>
               <property name="text">
                <string>3</string>
               </property>
              </widget>
             </item>
            </layout>
           </item>
           <item>
            <layout class="QHBoxLayout" name="horizontalLayout_4" stretch="0,0,0">
             <property name="spacing">
              <number>6</number>
             </property>
             <property name="leftMargin">
              <number>0</number>
             </property>
             <property name="rightMargin">
              <number>0</number>
             </property>
             <item>
              <widget class="QCheckBox" name="checkBox_4">
               <property name="text">
                <string/>
               </property>
              </widget>
             </item>
             <item>
              <widget class="QLineEdit" name="lineEdit_4"/>
             </item>
             <item>
              <widget class="QPushButton" name="pushButton_4">
               <property name="minimumSize">
                <size>
                 <width>35</width>
                 <height>23</height>
                </size>
               </property>
               <property name="maximumSize">
                <size>
                 <width>25</width>
                 <height>16777215</height>
                </size>
               </property>
               <property name="baseSize">
                <size>
                 <width>25</width>
                 <height>0</height>
                </size>
               </property>
               <property name="text">
                <string>4</string>
               </property>
              </widget>
             </item>
            </layout>
           </item>
           <item>
            <layout class="QHBoxLayout" name="horizontalLayout_5" stretch="0,0,0">
             <property name="spacing">
              <number>6</number>
             </property>
             <item>
              <widget class="QCheckBox" name="checkBox_5">
               <property name="text">
                <string/>
               </property>
              </widget>
             </item>
             <item>
              <widget class="QLineEdit" name="lineEdit_5"/>
             </item>
             <item>
              <widget class="QPushButton" name="pushButton_5">
               <property name="minimumSize">
                <size>
                 <width>35</width>
                 <height>23</height>
                </size>
               </property>
               <property name="maximumSize">
                <size>
                 <width>25</width>
                 <height>16777215</height>
                </size>
               </property>
               <property name="baseSize">
                <size>
                 <width>25</width>
                 <height>0</height>
                </size>
               </property>
               <property name="text">
                <string>5</string>
               </property>
              </widget>
             </item>
            </layout>
           </item>
           <item>
            <layout class="QHBoxLayout" name="horizontalLayout_6" stretch="0,0,0">
             <property name="spacing">
              <number>6</number>
             </property>
             <item>
              <widget class="QCheckBox" name="checkBox_6">
               <property name="text">
                <string/>
               </property>
              </widget>
             </item>
             <item>
              <widget class="QLineEdit" name="lineEdit_6"/>
             </item>
             <item>
              <widget class="QPushButton" name="pushButton_6">
               <property name="minimumSize">
                <size>
                 <width>35</width>
                 <height>23</height>
                </size>
               </property>
               <property name="maximumSize">
                <size>
                 <width>25</width>
                 <height>16777215</height>
                </size>
               </property>
               <property name="baseSize">
                <size>
                 <width>25</width>
                 <height>0</height>
                </size>
               </property>
               <property name="text">
                <string>6</string>
               </property>
              </widget>
             </item>
            </layout>
           </item>
           <item>
            <layout class="QHBoxLayout" name="horizontalLayout_7" stretch="0,0,0">
             <property name="spacing">
              <number>6</number>
             </property>
             <item>
              <widget class="QCheckBox" name="checkBox_7">
               <property name="text">
                <string/>
               </property>
              </widget>
             </item>
             <item>
              <widget class="QLineEdit" name="lineEdit_7"/>
             </item>
             <item>
              <widget class="QPushButton" name="pushButton_7">
               <property name="minimumSize">
                <size>
                 <width>35</width>
                 <height>23</height>
                </size>
               </property>
               <property name="maximumSize">
                <size>
                 <width>25</width>
                 <height>16777215</height>
                </size>
               </property>
               <property name="baseSize">
                <size>
                 <width>25</width>
                 <height>0</height>
                </size>
               </property>
               <property name="text">
                <string>7</string>
               </property>
              </widget>
             </item>
            </layout>
           </item>
           <item>
            <layout class="QHBoxLayout" name="horizontalLayout_8" stretch="0,0,0">
             <property name="spacing">
              <number>6</number>
             </property>
             <item>
              <widget class="QCheckBox" name="checkBox_8">
               <property name="text">
                <string/>
               </property>
              </widget>
             </item>
             <item>
              <widget class="QLineEdit" name="lineEdit_8"/>
             </item>
             <item>
              <widget class="QPushButton" name="pushButton_8">
               <property name="minimumSize">
                <size>
                 <width>35</width>
                 <height>23</height>
                </size>
               </property>
               <property name="maximumSize">
                <size>
                 <width>25</width>
                 <height>16777215</height>
                </size>
               </property>
               <property name="baseSize">
                <size>
                 <width>25</width>
                 <height>0</height>
                </size>
               </property>
               <property name="text">
                <string>8</string>
               </property>
              </widget>
             </item>
            </layout>
           </item>
           <item>
            <layout class="QHBoxLayout" name="horizontalLayout_9" stretch="0,0,0">
             <property name="spacing">
              <number>6</number>
             </property>
             <item>
              <widget class="QCheckBox" name="checkBox_9">
               <property name="text">
                <string/>
               </property>
              </widget>
             </item>
             <item>
              <widget class="QLineEdit" name="lineEdit_9"/>
             </item>
             <item>
              <widget class="QPushButton" name="pushButton_9">
               <property name="minimumSize">
                <size>
                 <width>35</width>
                 <height>23</height>
                </size>
               </property>
               <property name="maximumSize">
                <size>
                 <width>25</width>
                 <height>16777215</height>
                </size>
               </property>
               <property name="baseSize">
                <size>
                 <width>25</width>
                 <height>0</height>
                </size>
               </property>
               <property name="text">
                <string>9</string>
               </property>
              </widget>
             </item>
            </layout>
           </item>
          </layout>
         </item>
         <item>
          <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0">
           <property name="leftMargin">
            <number>0</number>
           </property>
           <property name="rightMargin">
            <number>10</number>
           </property>
           <item>
            <widget class="QCheckBox" name="checkBox_sendRound">
             <property name="maximumSize">
              <size>
               <width>16777215</width>
               <height>16777215</height>
              </size>
             </property>
             <property name="text">
              <string>循环发送</string>
             </property>
            </widget>
           </item>
           <item>
            <widget class="QSpinBox" name="spinBox">
             <property name="maximumSize">
              <size>
               <width>50</width>
               <height>16777215</height>
              </size>
             </property>
             <property name="maximum">
              <number>10000</number>
             </property>
            </widget>
           </item>
           <item>
            <widget class="QLabel" name="label_4">
             <property name="text">
              <string>ms</string>
             </property>
            </widget>
           </item>
          </layout>
         </item>
         <item>
          <layout class="QHBoxLayout" name="horizontalLayoutButtons">
           <property name="spacing">
            <number>8</number>
           </property>
           <property name="leftMargin">
            <number>0</number>
           </property>
           <property name="rightMargin">
            <number>0</number>
           </property>
           <item>
            <widget class="QPushButton" name="btnSave">
             <property name="minimumSize">
              <size>
               <width>35</width>
               <height>0</height>
              </size>
             </property>
             <property name="maximumSize">
              <size>
               <width>16777215</width>
               <height>16777215</height>
              </size>
             </property>
             <property name="text">
              <string>保存</string>
             </property>
            </widget>
           </item>
           <item>
            <widget class="QPushButton" name="btnOpen">
             <property name="minimumSize">
              <size>
               <width>35</width>
               <height>0</height>
              </size>
             </property>
             <property name="maximumSize">
              <size>
               <width>16777215</width>
               <height>16777215</height>
              </size>
             </property>
             <property name="text">
              <string>载入</string>
             </property>
            </widget>
           </item>
           <item>
            <widget class="QPushButton" name="btnReset">
             <property name="minimumSize">
              <size>
               <width>35</width>
               <height>0</height>
              </size>
             </property>
             <property name="maximumSize">
              <size>
               <width>16777215</width>
               <height>16777215</height>
              </size>
             </property>
             <property name="text">
              <string>重置</string>
             </property>
            </widget>
           </item>
          </layout>
         </item>
        </layout>
       </widget>
      </item>
     </layout>
    </item>
   </layout>
  </widget>
 </widget>
 <customwidgets>
  <customwidget>
   <class>MyComboBox</class>
   <extends>QComboBox</extends>
   <header>mycombobox.h</header>
  </customwidget>
 </customwidgets>
 <resources>
  <include location="res.qrc"/>
 </resources>
 <connections/>
</ui>
posted @ 2025-05-09 12:01  站着说话不腰疼  阅读(604)  评论(0)    收藏  举报