commit fdc93e494e9ecd863b1f4e5a02a8b197a0a8de46 Author: 168492376 <168492376@qq.com> Date: Mon Jan 13 23:00:58 2025 +0800 first version diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..49e6a9b --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "3rdparty/CSerialPort"] + path = 3rdparty/CSerialPort + url = https://github.com/itas109/CSerialPort.git diff --git a/3rdparty/CSerialPort b/3rdparty/CSerialPort new file mode 160000 index 0000000..c3928be --- /dev/null +++ b/3rdparty/CSerialPort @@ -0,0 +1 @@ +Subproject commit c3928be6d674bd3bb6df2c81b2486bcd4b82304b diff --git a/images/left_arrow_gray.png b/images/left_arrow_gray.png new file mode 100644 index 0000000..a3fd9a4 Binary files /dev/null and b/images/left_arrow_gray.png differ diff --git a/images/left_arrow_green.png b/images/left_arrow_green.png new file mode 100644 index 0000000..43ef9b9 Binary files /dev/null and b/images/left_arrow_green.png differ diff --git a/images/right_arrow_gray.png b/images/right_arrow_gray.png new file mode 100644 index 0000000..ecc1b9c Binary files /dev/null and b/images/right_arrow_gray.png differ diff --git a/images/right_arrow_green.png b/images/right_arrow_green.png new file mode 100644 index 0000000..bbf0672 Binary files /dev/null and b/images/right_arrow_green.png differ diff --git a/img.qrc b/img.qrc new file mode 100644 index 0000000..09f45bd --- /dev/null +++ b/img.qrc @@ -0,0 +1,8 @@ + + + images/right_arrow_green.png + images/left_arrow_green.png + images/right_arrow_gray.png + images/left_arrow_gray.png + + diff --git a/logo.ico b/logo.ico new file mode 100644 index 0000000..fa2f84d Binary files /dev/null and b/logo.ico differ diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..d871ca9 --- /dev/null +++ b/main.cpp @@ -0,0 +1,13 @@ + +#include "mainwindow.h" + +#include + + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..b38b9ce --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,22 @@ + +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include "serialConfigWidget.h" + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); + this->setWindowTitle("串口转发工具V1.0"); + + QWidget *wdg = new SerialConfigWidget(); + ui->verticalLayout->addWidget(wdg); +} + +MainWindow::~MainWindow() +{ + delete ui; +} + + diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..1cafe77 --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,26 @@ + +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include + + + +QT_BEGIN_NAMESPACE +namespace Ui { class MainWindow; } +QT_END_NAMESPACE + +class MainWindow : public QMainWindow + +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +private: + Ui::MainWindow *ui; +}; + +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..71b774f --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,42 @@ + + + MainWindow + + + + 0 + 0 + 555 + 500 + + + + MainWindow + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + + diff --git a/serialConfigWidget.cpp b/serialConfigWidget.cpp new file mode 100644 index 0000000..46bc72f --- /dev/null +++ b/serialConfigWidget.cpp @@ -0,0 +1,169 @@ +#include "serialConfigWidget.h" +#include "ui_serialConfigWidget.h" +#include +#include +#include +#include +#include +#include + +SerialConfigWidget::SerialConfigWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::SerialConfigWidget) +{ + ui->setupUi(this); + m_SerialPort1.connectReadEvent(this); + m_SerialPort2.connectReadEvent(this); + refreshCom(); + connect(this,SIGNAL(displayTextSignal(QString)),this,SLOT(displayText(QString)),Qt::QueuedConnection); +} + +SerialConfigWidget::~SerialConfigWidget() +{ + delete ui; +} + +void SerialConfigWidget::refreshCom() +{ + QString currentTxt1 = ui->cmbCom1->currentText(); + QString currentTxt2 = ui->cmbCom2->currentText(); + QStringList nameList; + foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) + { + nameList.append(info.portName()); + } + std::sort(nameList.begin(), nameList.end(), [&](QString &s1, QString &s2){ + if(s1.size()==s2.size()){ + return s1cmbCom1->clear(); + ui->cmbCom1->addItems(nameList); + if(!currentTxt1.isEmpty()){ + ui->cmbCom1->setCurrentText(currentTxt1); + } + + ui->cmbCom2->clear(); + ui->cmbCom2->addItems(nameList); + if(!currentTxt2.isEmpty()){ + ui->cmbCom2->setCurrentText(currentTxt2); + } +} + +void SerialConfigWidget::on_toolBtnRefresh_clicked() +{ + refreshCom(); +} + + +void SerialConfigWidget::on_toolBtnOk_clicked() +{ + if(ui->toolBtnOk->isChecked()){ + QString portName1 = ui->cmbCom1->currentText(); + QString baud1 = ui->cmbBaud1->currentText(); + + m_SerialPort1.init(portName1.toStdString().c_str(),baud1.toInt(), + itas109::Parity::ParityNone,itas109::DataBits::DataBits8, + itas109::StopBits::StopOne); + m_SerialPort1.setReadIntervalTimeout(readIntervalTimeoutMS); + if(!m_SerialPort1.open()){ + QMessageBox::warning(NULL,tr("警告"),portName1 + tr("打开错误") + QString("\n\ncode: %1\nmessage: %2").arg( + m_SerialPort1.getLastError()).arg(m_SerialPort1.getLastErrorMsg())); + ui->toolBtnOk->setChecked(false); + return ; + } + + QString portName2 = ui->cmbCom2->currentText(); + QString baud2 = ui->cmbBaud2->currentText(); + + m_SerialPort2.init(portName2.toStdString().c_str(),baud2.toInt(), + itas109::Parity::ParityNone,itas109::DataBits::DataBits8, + itas109::StopBits::StopOne); + m_SerialPort2.setReadIntervalTimeout(readIntervalTimeoutMS); + if(!m_SerialPort2.open()){ + QMessageBox::warning(NULL,tr("警告"),portName2 + tr("打开错误") + QString("\n\ncode: %1\nmessage: %2").arg( + m_SerialPort2.getLastError()).arg(m_SerialPort2.getLastErrorMsg())); + m_SerialPort1.close(); + ui->toolBtnOk->setChecked(false); + return ; + } + + ui->toolBtnOk->setStyleSheet("color:green"); + ui->cmbCom1->setDisabled(true); + ui->cmbBaud1->setDisabled(true); + ui->cmbCom2->setDisabled(true); + ui->cmbBaud2->setDisabled(true); + ui->toolBtnRefresh->setDisabled(true); + ui->toolBtnOk->setChecked(true); + }else{ + m_SerialPort1.close(); + m_SerialPort2.close(); + ui->toolBtnOk->setStyleSheet("color:balck"); + ui->cmbCom1->setEnabled(true); + ui->cmbBaud1->setEnabled(true); + ui->cmbCom2->setEnabled(true); + ui->cmbBaud2->setEnabled(true); + ui->toolBtnRefresh->setEnabled(true); + ui->toolBtnOk->setChecked(false); + } + +} + +void SerialConfigWidget::displayText(const QString &txt) +{ + ui->plainTextEdit->appendPlainText(txt.trimmed()); +} + +void SerialConfigWidget::onReadEvent(const char *portName, unsigned int readBufferLen) +{ + QMutexLocker locker(&mtx); + if(portName && std::strcmp(portName,m_SerialPort1.getPortName())==0){ + int recLen = 0; + char * str = NULL; + str = new char[readBufferLen]; + if(str){ + recLen = m_SerialPort1.readData(str, readBufferLen); + } + + if(str && recLen > 0) + { + // TODO: 中文需要由两个字符拼接,否则显示为空"" + //QString m_str = QString::fromLocal8Bit(str,recLen); + //emitUpdateReceive(m_str); + m_SerialPort2.writeData(str,recLen); + QString txt = QString("%1:%2").arg(QString::fromLocal8Bit(portName,std::strlen(portName))).arg(QString::fromLocal8Bit(str,recLen)); + emit displayTextSignal(txt); + } + + if(str) + { + delete[] str; + str = NULL; + } + }else if(portName && std::strcmp(portName,m_SerialPort2.getPortName())==0){ + int recLen = 0; + char * str = NULL; + str = new char[readBufferLen]; + if(str){ + recLen = m_SerialPort2.readData(str, readBufferLen); + } + + if(str && recLen > 0) + { + // TODO: 中文需要由两个字符拼接,否则显示为空"" + //QString m_str = QString::fromLocal8Bit(str,recLen); + //emitUpdateReceive(m_str); + m_SerialPort1.writeData(str,recLen); + QString txt = QString("%1:%2").arg(QString::fromLocal8Bit(portName,std::strlen(portName))).arg(QString::fromLocal8Bit(str,recLen)); + emit displayTextSignal(txt); + } + + if(str) + { + delete[] str; + str = NULL; + } + } +} + diff --git a/serialConfigWidget.h b/serialConfigWidget.h new file mode 100644 index 0000000..7e92db3 --- /dev/null +++ b/serialConfigWidget.h @@ -0,0 +1,41 @@ +#ifndef SERIALCONFIGWIDGET_H +#define SERIALCONFIGWIDGET_H + +#include +#include +#include "CSerialPort/SerialPort.h" + +using namespace itas109; + +namespace Ui { +class SerialConfigWidget; +} + +class SerialConfigWidget : public QWidget ,public CSerialPortListener +{ + Q_OBJECT + +public: + explicit SerialConfigWidget(QWidget *parent = nullptr); + ~SerialConfigWidget(); + +signals: + void displayTextSignal(const QString &txt); + +private slots: + void on_toolBtnRefresh_clicked(); + void on_toolBtnOk_clicked(); + void displayText(const QString &txt); + +private slots: + void onReadEvent(const char *portName, unsigned int readBufferLen) override; + +private: + Ui::SerialConfigWidget *ui; + CSerialPort m_SerialPort1,m_SerialPort2; + int readIntervalTimeoutMS = 50; + QMutex mtx; + void refreshCom(); +}; + +#endif // SERIALCONFIGWIDGET_H diff --git a/serialConfigWidget.ui b/serialConfigWidget.ui new file mode 100644 index 0000000..3b5bc7f --- /dev/null +++ b/serialConfigWidget.ui @@ -0,0 +1,284 @@ + + + SerialConfigWidget + + + + 0 + 0 + 702 + 374 + + + + + 0 + 0 + + + + Form + + + + 4 + + + 4 + + + 4 + + + 4 + + + 0 + + + + + QGroupBox{border:none} + + + + + + true + + + + + + 串口号: + + + + + + + + + + 波特率: + + + + + + + true + + + + 115200 + + + + + 230400 + + + + + 460800 + + + + + 921600 + + + + + + + + + + + QGroupBox{border:none} + + + + + + true + + + + + + 串口号: + + + + + + + + + + 波特率: + + + + + + + true + + + + 115200 + + + + + 230400 + + + + + 460800 + + + + + 921600 + + + + + + + + + + + QGroupBox{border:none} + + + + + + + + + 刷新 + + + + + + + 确定 + + + true + + + false + + + + + + + + + + QGroupBox{border:none} + + + + + + false + + + + 0 + + + + + + 0 + 0 + + + + + 40 + 12 + + + + + 40 + 12 + + + + false + + + + + + :/images/images/left_arrow_gray.png + + + true + + + + + + + + 0 + 0 + + + + + 40 + 12 + + + + + 40 + 12 + + + + + + + :/images/images/right_arrow_gray.png + + + true + + + + + + + + + + 10000 + + + + + + + + + + diff --git a/serialTransferTool.pro b/serialTransferTool.pro new file mode 100644 index 0000000..63f8011 --- /dev/null +++ b/serialTransferTool.pro @@ -0,0 +1,39 @@ +QT += core gui serialport + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++17 + +# You can make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +msvc{ + QMAKE_CFLAGS += /utf-8 + QMAKE_CXXFLAGS += /utf-8 +} + +include($$PWD/3rdparty/CSerialPort/examples/CommQT/commqt.pri) + +SOURCES += \ + main.cpp \ + mainwindow.cpp \ + serialConfigWidget.cpp + +HEADERS += \ + mainwindow.h \ + serialConfigWidget.h + +FORMS += \ + mainwindow.ui \ + serialConfigWidget.ui + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +RESOURCES += \ + img.qrc + +RC_ICONS = logo.ico