提交 743d2895 编写于 作者: aptblaze's avatar aptblaze

更新main.cpp, mainwindow.cpp, mainwindow.h, mainwindow.ui, MyCom _Thread.pro,...

更新main.cpp, mainwindow.cpp, mainwindow.h, mainwindow.ui, MyCom _Thread.pro, serialworker.cpp, serialworker.h, ui_mainwindow.h
上级
#-------------------------------------------------
#
# Project created by QtCreator 2021-06-17T14:04:17
#
#-------------------------------------------------
QT += core gui
QT += serialport
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = MyCom _Thread
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += main.cpp\
mainwindow.cpp \
serialworker.cpp
HEADERS += mainwindow.h \
serialworker.h
FORMS += mainwindow.ui
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle("子线程读串口");
this->setMinimumSize(600,248);
this->setMaximumSize(1200,496);
InitSerialPortName();
//1.新建串口处理子线程
SerialWorker *ser = new SerialWorker(&serial_1);
ser->moveToThread(&serialThread_1);
// 2.连接信号和槽
QString s;
connect(&serialThread_1, &QThread::finished, ser, &QObject::deleteLater); // 线程结束,自动删除对象
connect(&serial_1, &QSerialPort::readyRead, ser, &SerialWorker::doDataReciveWork); // 主线程通知子线程接收数据的信号
connect(ser, &SerialWorker::sendResultToGui, this, &MainWindow::handleResults); // 主线程收到数据结果的信号
// connect(ser,SIGNAL(sendResultToGui(QString)), this, SLOT(handleResults(QString))); //主线程收到数据结果的信号写法2
// 3.开始运行子线程
serialThread_1.start(); // 线程开始运行
}
MainWindow::~MainWindow()
{
serialThread_1.quit();
serialThread_1.wait();
delete ui;
}
void MainWindow::InitSerialPortName()
{
// 清空下拉框
ui->box_portName->clear();
//通过QSerialPortInfo查找可用串口
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
QString showName = info.portName();
qDebug() << showName+info.description();
ui->box_portName->addItem(showName);
}
//波特率
QStringList baudrateList;
baudrateList<<"4800"<<"9600"<<"19200"<<"38400"<<"57600"<<"115200";
ui->box_baudrate->addItems(baudrateList);//添加下拉列表选项
ui->box_baudrate->setCurrentText("115200");//界面中初始值
// ui->box_baudrate->setView(new QListView(this));//该设置是配合qss的,不然item行高设置没效果
//数据位
QStringList databitList;
databitList<<"5"<<"6"<<"7"<<"8";
ui->box_dataBits->addItems(databitList);
ui->box_dataBits->setCurrentText("8");
// ui->box_dataBits->setView(new QListView(this));
//校验位
QStringList parityList;
parityList<<"无"<<"奇"<<"偶";
ui->box_parityBit->addItems(parityList);
ui->box_parityBit->setCurrentText("No");
// ui->box_parityBit->setView(new QListView(this));
//停止位
QStringList stopbitList;
stopbitList<<"1"<<"2";
ui->box_stopBit->addItems(stopbitList);
ui->box_stopBit->setCurrentText("1");
// ui->box_stopBit->setView(new QListView(this));
//流控制
// QStringList flowctrlList;
// flowctrlList<<"No"<<"Hardware"<<"Software";
// ui->boxFlowControl->addItems(flowctrlList);
// ui->boxFlowControl->setCurrentText("No");
//// ui->boxFlowControl->setView(new QListView(this));
}
void MainWindow::on_btn_openPort_clicked()
{
if(ui->btn_openPort->text()==QString("打开串口"))
{
//设置串口名
QString portName = (ui->box_portName->currentText()).split(":").at(0);
qDebug() <<"当前打开串口为:"<<portName;
serial_1.setPortName(portName);
//设置波特率
serial_1.setBaudRate(ui->box_baudrate->currentText().toInt());
//设置停止位
if(ui->box_stopBit->currentText() == "1")
serial_1.setStopBits(QSerialPort::OneStop);
else if(ui->box_stopBit->currentText() == "2")
serial_1.setStopBits(QSerialPort::TwoStop);
//设置数据位数
if(ui->box_dataBits->currentText() == "8")
serial_1.setDataBits(QSerialPort::Data8);
else if(ui->box_dataBits->currentText() == "7")
serial_1.setDataBits(QSerialPort::Data7);
else if(ui->box_dataBits->currentText() == "6")
serial_1.setDataBits(QSerialPort::Data6);
else if(ui->box_dataBits->currentText() == "5")
serial_1.setDataBits(QSerialPort::Data5);
//设置奇偶校验
if(ui->box_parityBit->currentText() == "无")
serial_1.setParity(QSerialPort::NoParity);
else if(ui->box_parityBit->currentText() == "偶")
serial_1.setParity(QSerialPort::EvenParity);
else if(ui->box_parityBit->currentText() == "奇")
serial_1.setParity(QSerialPort::OddParity);
// //设置流控制
// serial_1.setFlowControl(QSerialPort::NoFlowControl);
//打开串口
if(!serial_1.open(QIODevice::ReadWrite))
{
QMessageBox::about(NULL, "提示", "无法打开串口!");
return;
}
//下拉菜单控件失能
ui->box_portName->setEnabled(false);
ui->box_baudrate->setEnabled(false);
ui->box_dataBits->setEnabled(false);
ui->box_parityBit->setEnabled(false);
ui->box_stopBit->setEnabled(false);
ui->btn_openPort->setText(QString("关闭串口"));
}
else
{
//关闭串口
serial_1.close();
//下拉菜单控件使能
ui->box_portName->setEnabled(true);
ui->box_baudrate->setEnabled(true);
ui->box_dataBits->setEnabled(true);
ui->box_parityBit->setEnabled(true);
ui->box_stopBit->setEnabled(true);
ui->btn_openPort->setText(QString("打开串口"));
}
}
void MainWindow::on_btn_clearText_clicked()
{
ui->browser_dataReceive->clear();
}
void MainWindow::handleResults(const QString &result)
{
qDebug() << "主线程收到结果数据:" << result << "线程ID:" << QThread::currentThreadId();
//从界面中读取以前收到的数据
QString oldString = ui->browser_dataReceive->toPlainText()+'\n';
oldString = oldString + QString(result);
//清空以前的显示
ui->browser_dataReceive->clear();
//重新显示
ui->browser_dataReceive->append(oldString);
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QMessageBox>
#include <QDebug>
#include <QThread>
#include "serialworker.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
void InitSerialPortName();
QSerialPort serial_1;
QThread serialThread_1; // 定义子线程
signals:
void serialDataSend(const QByteArray data);
private slots:
void on_btn_openPort_clicked();
void on_btn_clearText_clicked();
void handleResults(const QString &result);
};
#endif // MAINWINDOW_H
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>248</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralWidget">
<widget class="QGroupBox" name="groupBox_2">
<property name="geometry">
<rect>
<x>10</x>
<y>0</y>
<width>251</width>
<height>241</height>
</rect>
</property>
<property name="toolTipDuration">
<number>-1</number>
</property>
<property name="title">
<string>基本设置</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="flat">
<bool>false</bool>
</property>
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>241</width>
<height>211</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="0">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="1">
<widget class="QLabel" name="label_4">
<property name="text">
<string>校验位:</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QComboBox" name="box_dataBits"/>
</item>
<item row="0" column="3">
<widget class="QComboBox" name="box_portName"/>
</item>
<item row="4" column="3">
<widget class="QComboBox" name="box_stopBit"/>
</item>
<item row="3" column="3">
<widget class="QComboBox" name="box_parityBit"/>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_3">
<property name="text">
<string>数据位:</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label">
<property name="text">
<string>端口号:</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="label_5">
<property name="text">
<string>停止位:</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_2">
<property name="text">
<string>波特率:</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QComboBox" name="box_baudrate"/>
</item>
<item row="4" column="4">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btn_openPort">
<property name="text">
<string>打开串口</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_clearText">
<property name="text">
<string>清空接收区</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
<widget class="QGroupBox" name="groupBox">
<property name="geometry">
<rect>
<x>270</x>
<y>0</y>
<width>321</width>
<height>241</height>
</rect>
</property>
<property name="toolTipDuration">
<number>-1</number>
</property>
<property name="title">
<string>接收区</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="flat">
<bool>false</bool>
</property>
<widget class="QTextEdit" name="browser_dataReceive">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>301</width>
<height>211</height>
</rect>
</property>
</widget>
</widget>
</widget>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>
#include "serialworker.h"
SerialWorker::SerialWorker(QSerialPort *ser, QObject *parent) : QObject(parent),serial(ser)
{
}
QString SerialWorker::ByteArrayToHexString(QByteArray data)
{
QString ret(data.toHex().toUpper());
int len = ret.length()/2;
qDebug()<<"收到字节长度为:"<<len;
for(int i=1;i<len;i++)
{
ret.insert(2*i+i-1," ");
}
return ret;
}
void SerialWorker::doDataReciveWork()
{
QByteArray buffer = serial->readAll();
// 2.进行数据处理
QString result = ByteArrayToHexString(buffer);
qDebug() << "子线程收到数据:" << result << "线程ID:" << QThread::currentThreadId();
// 3.将结果发送到主线程
emit sendResultToGui(result);
}
#ifndef SERIALWORKER_H
#define SERIALWORKER_H
#include <QObject>
#include <QSerialPort>
#include <QDebug>
#include <QThread>
class SerialWorker : public QObject
{
Q_OBJECT
public:
explicit SerialWorker(QSerialPort *ser,QObject *parent = 0);
signals:
void sendResultToGui(const QString result);
public slots:
void doDataReciveWork();
private:
QSerialPort *serial;
QString ByteArrayToHexString(QByteArray);
};
#endif // SERIALWORKER_H
/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 5.8.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QComboBox>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QGroupBox>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLabel>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QSpacerItem>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_MainWindow
{
public:
QWidget *centralWidget;
QGroupBox *groupBox_2;
QWidget *layoutWidget;
QVBoxLayout *verticalLayout_2;
QGridLayout *gridLayout;
QSpacerItem *horizontalSpacer_4;
QLabel *label_4;
QComboBox *box_dataBits;
QComboBox *box_portName;
QComboBox *box_stopBit;
QComboBox *box_parityBit;
QLabel *label_3;
QLabel *label;
QLabel *label_5;
QLabel *label_2;
QComboBox *box_baudrate;
QSpacerItem *horizontalSpacer_3;
QSpacerItem *horizontalSpacer_5;
QHBoxLayout *horizontalLayout;
QSpacerItem *horizontalSpacer;
QPushButton *btn_openPort;
QPushButton *btn_clearText;
QSpacerItem *horizontalSpacer_2;
QGroupBox *groupBox;
QTextEdit *browser_dataReceive;
void setupUi(QMainWindow *MainWindow)
{
if (MainWindow->objectName().isEmpty())
MainWindow->setObjectName(QStringLiteral("MainWindow"));
MainWindow->resize(600, 248);
centralWidget = new QWidget(MainWindow);
centralWidget->setObjectName(QStringLiteral("centralWidget"));
groupBox_2 = new QGroupBox(centralWidget);
groupBox_2->setObjectName(QStringLiteral("groupBox_2"));
groupBox_2->setGeometry(QRect(10, 0, 251, 241));
groupBox_2->setToolTipDuration(-1);
groupBox_2->setAlignment(Qt::AlignCenter);
groupBox_2->setFlat(false);
layoutWidget = new QWidget(groupBox_2);
layoutWidget->setObjectName(QStringLiteral("layoutWidget"));
layoutWidget->setGeometry(QRect(10, 20, 241, 211));
verticalLayout_2 = new QVBoxLayout(layoutWidget);
verticalLayout_2->setSpacing(6);
verticalLayout_2->setContentsMargins(11, 11, 11, 11);
verticalLayout_2->setObjectName(QStringLiteral("verticalLayout_2"));
verticalLayout_2->setContentsMargins(0, 0, 0, 0);
gridLayout = new QGridLayout();
gridLayout->setSpacing(6);
gridLayout->setObjectName(QStringLiteral("gridLayout"));
horizontalSpacer_4 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
gridLayout->addItem(horizontalSpacer_4, 4, 0, 1, 1);
label_4 = new QLabel(layoutWidget);
label_4->setObjectName(QStringLiteral("label_4"));
label_4->setAlignment(Qt::AlignCenter);
gridLayout->addWidget(label_4, 3, 1, 1, 1);
box_dataBits = new QComboBox(layoutWidget);
box_dataBits->setObjectName(QStringLiteral("box_dataBits"));
gridLayout->addWidget(box_dataBits, 2, 3, 1, 1);
box_portName = new QComboBox(layoutWidget);
box_portName->setObjectName(QStringLiteral("box_portName"));
gridLayout->addWidget(box_portName, 0, 3, 1, 1);
box_stopBit = new QComboBox(layoutWidget);
box_stopBit->setObjectName(QStringLiteral("box_stopBit"));
gridLayout->addWidget(box_stopBit, 4, 3, 1, 1);
box_parityBit = new QComboBox(layoutWidget);
box_parityBit->setObjectName(QStringLiteral("box_parityBit"));
gridLayout->addWidget(box_parityBit, 3, 3, 1, 1);
label_3 = new QLabel(layoutWidget);
label_3->setObjectName(QStringLiteral("label_3"));
label_3->setAlignment(Qt::AlignCenter);
gridLayout->addWidget(label_3, 2, 1, 1, 1);
label = new QLabel(layoutWidget);
label->setObjectName(QStringLiteral("label"));
label->setAlignment(Qt::AlignCenter);
gridLayout->addWidget(label, 0, 1, 1, 1);
label_5 = new QLabel(layoutWidget);
label_5->setObjectName(QStringLiteral("label_5"));
label_5->setAlignment(Qt::AlignCenter);
gridLayout->addWidget(label_5, 4, 1, 1, 1);
label_2 = new QLabel(layoutWidget);
label_2->setObjectName(QStringLiteral("label_2"));
label_2->setAlignment(Qt::AlignCenter);
gridLayout->addWidget(label_2, 1, 1, 1, 1);
box_baudrate = new QComboBox(layoutWidget);
box_baudrate->setObjectName(QStringLiteral("box_baudrate"));
gridLayout->addWidget(box_baudrate, 1, 3, 1, 1);
horizontalSpacer_3 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
gridLayout->addItem(horizontalSpacer_3, 4, 4, 1, 1);
horizontalSpacer_5 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
gridLayout->addItem(horizontalSpacer_5, 0, 2, 1, 1);
verticalLayout_2->addLayout(gridLayout);
horizontalLayout = new QHBoxLayout();
horizontalLayout->setSpacing(6);
horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
horizontalLayout->addItem(horizontalSpacer);
btn_openPort = new QPushButton(layoutWidget);
btn_openPort->setObjectName(QStringLiteral("btn_openPort"));
horizontalLayout->addWidget(btn_openPort);
btn_clearText = new QPushButton(layoutWidget);
btn_clearText->setObjectName(QStringLiteral("btn_clearText"));
horizontalLayout->addWidget(btn_clearText);
horizontalSpacer_2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
horizontalLayout->addItem(horizontalSpacer_2);
verticalLayout_2->addLayout(horizontalLayout);
groupBox = new QGroupBox(centralWidget);
groupBox->setObjectName(QStringLiteral("groupBox"));
groupBox->setGeometry(QRect(270, 0, 321, 241));
groupBox->setToolTipDuration(-1);
groupBox->setAlignment(Qt::AlignCenter);
groupBox->setFlat(false);
browser_dataReceive = new QTextEdit(groupBox);
browser_dataReceive->setObjectName(QStringLiteral("browser_dataReceive"));
browser_dataReceive->setGeometry(QRect(10, 20, 301, 211));
MainWindow->setCentralWidget(centralWidget);
retranslateUi(MainWindow);
QMetaObject::connectSlotsByName(MainWindow);
} // setupUi
void retranslateUi(QMainWindow *MainWindow)
{
MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", Q_NULLPTR));
groupBox_2->setTitle(QApplication::translate("MainWindow", "\345\237\272\346\234\254\350\256\276\347\275\256", Q_NULLPTR));
label_4->setText(QApplication::translate("MainWindow", "\346\240\241\351\252\214\344\275\215\357\274\232", Q_NULLPTR));
label_3->setText(QApplication::translate("MainWindow", "\346\225\260\346\215\256\344\275\215\357\274\232", Q_NULLPTR));
label->setText(QApplication::translate("MainWindow", "\347\253\257\345\217\243\345\217\267\357\274\232", Q_NULLPTR));
label_5->setText(QApplication::translate("MainWindow", "\345\201\234\346\255\242\344\275\215\357\274\232", Q_NULLPTR));
label_2->setText(QApplication::translate("MainWindow", "\346\263\242\347\211\271\347\216\207\357\274\232", Q_NULLPTR));
btn_openPort->setText(QApplication::translate("MainWindow", "\346\211\223\345\274\200\344\270\262\345\217\243", Q_NULLPTR));
btn_clearText->setText(QApplication::translate("MainWindow", "\346\270\205\347\251\272\346\216\245\346\224\266\345\214\272", Q_NULLPTR));
groupBox->setTitle(QApplication::translate("MainWindow", "\346\216\245\346\224\266\345\214\272", Q_NULLPTR));
} // retranslateUi
};
namespace Ui {
class MainWindow: public Ui_MainWindow {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_MAINWINDOW_H
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册