实现打开串口

添加了控制串口类 在子进程中进行IO操作
This commit is contained in:
才明洋
2018-01-17 11:19:02 +08:00
parent adb52f502a
commit 1ce1dc77c1
5 changed files with 172 additions and 3 deletions
+4 -2
View File
@@ -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
View File
@@ -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();
}
+20
View File
@@ -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
+63
View File
@@ -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);
}
+32
View File
@@ -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