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>

浙公网安备 33010602011771号