实现打开串口
添加了控制串口类 在子进程中进行IO操作
This commit is contained in:
+4
-2
@@ -25,7 +25,9 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
mainwindow.cpp
|
||||
mainwindow.cpp \
|
||||
serialcontroller.cpp
|
||||
|
||||
HEADERS += \
|
||||
mainwindow.h
|
||||
mainwindow.h \
|
||||
serialcontroller.h
|
||||
|
||||
+53
-1
@@ -35,6 +35,8 @@ MainWindow::MainWindow(QWidget *parent)
|
||||
OpenButton = new QPushButton(tr("打开串口"));
|
||||
SendButton = new QPushButton(tr("发送"));
|
||||
|
||||
connect(OpenButton, QPushButton::clicked, this, OpenSerial);
|
||||
|
||||
//初始化布局
|
||||
layout = new QGridLayout(this);
|
||||
layout->addWidget(BaudrateLabel, 1, 0);
|
||||
@@ -63,7 +65,19 @@ MainWindow::MainWindow(QWidget *parent)
|
||||
CheckSerials();
|
||||
|
||||
//开始串口进程
|
||||
// SerialThr.start();
|
||||
serialController = new SerialController;
|
||||
serialController->moveToThread(&SerialThr);
|
||||
SerialThr.start();
|
||||
|
||||
connect(this, requestOpen, serialController, SerialController::openSerial);
|
||||
connect(this, requestClose, serialController, SerialController::closeSerial);
|
||||
connect(serialController, SerialController::openSuccess, this, serialOpened);
|
||||
connect(serialController, SerialController::openFailed, this, serialNotOpened);
|
||||
connect(serialController, SerialController::closeSuccess, this, serialClosed);
|
||||
connect(this, setBaudRate, serialController, SerialController::getBaudrate);
|
||||
connect(this, setStopBits, serialController, SerialController::getStopbits);
|
||||
connect(this, setDataBits, serialController, SerialController::getDatabits);
|
||||
connect(this, setParity, serialController, SerialController::getParity);
|
||||
}
|
||||
|
||||
void MainWindow::CheckSerials()
|
||||
@@ -83,6 +97,7 @@ void MainWindow::CheckSerials()
|
||||
COMBox->setDisabled(false);
|
||||
COMBox->clear();
|
||||
COMBox->addItems(COMList);
|
||||
OpenButton->setDisabled(false);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -91,10 +106,47 @@ void MainWindow::CheckSerials()
|
||||
COMList.clear();
|
||||
COMBox->addItem(tr("(空)"));
|
||||
COMBox->setDisabled(true);
|
||||
OpenButton->setDisabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
SerialThr.terminate();
|
||||
}
|
||||
|
||||
void MainWindow::serialOpened()
|
||||
{
|
||||
OpenButton->setText(tr("关闭串口"));
|
||||
disconnect(OpenButton, QPushButton::clicked, this, OpenSerial);
|
||||
connect(OpenButton, QPushButton::clicked, this, CloseSerial);
|
||||
}
|
||||
|
||||
void MainWindow::serialNotOpened()
|
||||
{
|
||||
qDebug()<<"打开失败";
|
||||
}
|
||||
|
||||
void MainWindow::serialClosed()
|
||||
{
|
||||
OpenButton->setText(tr("打开串口"));
|
||||
disconnect(OpenButton, QPushButton::clicked, this, CloseSerial);
|
||||
connect(OpenButton, QPushButton::clicked, this, OpenSerial);
|
||||
}
|
||||
|
||||
void MainWindow::OpenSerial()
|
||||
{
|
||||
QString portName = COMBox->currentText().split(' ')[0];
|
||||
qDebug()<<portName;
|
||||
emit requestOpen(portName);
|
||||
emit setBaudRate(BaudrateBox->currentText());
|
||||
emit setStopBits(StopbitsBox->currentText());
|
||||
emit setDataBits(StopbitsBox->currentText());
|
||||
emit setParity(ParityBox->currentText());
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::CloseSerial()
|
||||
{
|
||||
emit requestClose();
|
||||
}
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
#include <QSerialPortInfo>
|
||||
#include <QLabel>
|
||||
#include <QThread>
|
||||
#include "serialcontroller.h"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
|
||||
class MainWindow : public QWidget
|
||||
@@ -21,6 +24,19 @@ public:
|
||||
void CheckSerials();
|
||||
~MainWindow();
|
||||
|
||||
signals:
|
||||
void requestOpen(QString portName);
|
||||
void requestClose();
|
||||
void setBaudRate(QString baudrate);
|
||||
void setStopBits(QString stopbits);
|
||||
void setDataBits(QString databits);
|
||||
void setParity(QString parity);
|
||||
|
||||
public slots:
|
||||
void serialOpened();
|
||||
void serialNotOpened();
|
||||
void serialClosed();
|
||||
|
||||
private:
|
||||
QComboBox *COMBox, *BaudrateBox, *StopbitsBox, *DatabitsBox, *ParityBox;
|
||||
QStringList COMList, BaudrateList, StopbitsList, DatabitsList, ParityList;
|
||||
@@ -29,7 +45,11 @@ private:
|
||||
QTextEdit *RecvArea, *SendArea;
|
||||
QPushButton *OpenButton, *SendButton;
|
||||
QTimer *CheckTimer;
|
||||
SerialController *serialController;
|
||||
QThread SerialThr;
|
||||
|
||||
void OpenSerial();
|
||||
void CloseSerial();
|
||||
};
|
||||
|
||||
#endif // MAINWINDOW_H
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
#include "serialcontroller.h"
|
||||
|
||||
SerialController::SerialController(QObject *parent) : QObject(parent)
|
||||
{
|
||||
serial = new QSerialPort(this);
|
||||
}
|
||||
|
||||
void SerialController::openSerial(QString name)
|
||||
{
|
||||
serial->setPortName(name);
|
||||
if(serial->open(QIODevice::ReadWrite))
|
||||
{
|
||||
//串口打开成功
|
||||
emit openSuccess();
|
||||
}
|
||||
else
|
||||
{
|
||||
//串口打开失败
|
||||
emit openFailed();
|
||||
}
|
||||
}
|
||||
|
||||
void SerialController::closeSerial()
|
||||
{
|
||||
if(serial->isOpen())
|
||||
{
|
||||
serial->close();
|
||||
emit closeSuccess();
|
||||
}
|
||||
}
|
||||
|
||||
void SerialController::getBaudrate(QString baudrate)
|
||||
{
|
||||
serial->setBaudRate(baudrate.toInt());
|
||||
|
||||
}
|
||||
|
||||
void SerialController::getStopbits(QString stopbits)
|
||||
{
|
||||
if(stopbits == "1")
|
||||
serial->setStopBits(QSerialPort::OneStop);
|
||||
else if(stopbits == "1.5")
|
||||
serial->setStopBits(QSerialPort::OneAndHalfStop);
|
||||
else if(stopbits == "2")
|
||||
serial->setStopBits(QSerialPort::TwoStop);
|
||||
}
|
||||
|
||||
void SerialController::getDatabits(QString databits)
|
||||
{
|
||||
serial->setDataBits(QSerialPort::DataBits(databits.toInt()));
|
||||
}
|
||||
|
||||
void SerialController::getParity(QString parity)
|
||||
{
|
||||
if(parity == tr("无"))
|
||||
serial->setParity(QSerialPort::NoParity);
|
||||
|
||||
else if(parity == tr("奇校验"))
|
||||
serial->setParity(QSerialPort::OddParity);
|
||||
|
||||
else if(parity == tr("偶校验"))
|
||||
serial->setParity(QSerialPort::EvenParity);
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
#ifndef SERIALCONTROLLER_H
|
||||
#define SERIALCONTROLLER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QSerialPort>
|
||||
#include <QDebug>
|
||||
|
||||
class SerialController : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit SerialController(QObject *parent = nullptr);
|
||||
|
||||
signals:
|
||||
void openSuccess();
|
||||
void openFailed();
|
||||
void closeSuccess();
|
||||
|
||||
public slots:
|
||||
void openSerial(QString name);
|
||||
void closeSerial();
|
||||
void getBaudrate(QString baudrate);
|
||||
void getStopbits(QString stopbits);
|
||||
void getDatabits(QString databits);
|
||||
void getParity(QString parity);
|
||||
|
||||
private:
|
||||
QSerialPort *serial;
|
||||
|
||||
};
|
||||
|
||||
#endif // SERIALCONTROLLER_H
|
||||
Reference in New Issue
Block a user