1. 程式人生 > 其它 >Qt 新手實戰專案之手把手打造一個串列埠助手

Qt 新手實戰專案之手把手打造一個串列埠助手

一前景

很多時候我們在學習一門新的語言,一直在學習各種語法和記住各種關鍵字,很容易產生枯燥的情緒,感覺學習這些玩意兒不知道用在什麼地方,心裡很是苦惱,這不,我在這記錄下我學習Qt的第一個的小專案-串列埠通訊助手吧,邊做專案邊學習比單獨看知識點可有趣多啦。話不多說,我們就現在開始吧!

二準備工作

我這邊使用的Qt版本為5.12.8,然後開啟qt creator。

1,新建專案,選擇Qt Widgets Application

2,填寫名稱和建立路徑

3.之後一直預設點下一步。

4.完成後專案是以下這樣的,我的專案名稱為:MySerialport

這樣我們的準備工作就完成了!

三編寫程式碼

1,我們雙擊開啟:MySerialport.pro 檔案



在這新增 Qt += serialport,然後點選ctrl+s儲存

執行qmake一下,重新構建

2,新增標頭檔案

3.好了,準備工作已經做好了,接下來我們先設計ui介面

接下來出現ui設計介面

設計完成後

現在開始到了關鍵的時候,我們開始寫程式碼
這是標頭檔案:mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    void _Init();

private:
    void _onOpen();
    void _onClose();
    void _onSendData();
    void _onSerialDatas();

private:
    Ui::MainWindow *ui;
    QSerialPort *_serial;

};
#endif // MAINWINDOW_H

這是原始檔

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , _serial(nullptr)
{
    ui->setupUi(this);
    _Init();
}

MainWindow::~MainWindow()
{
    delete ui;
    _onClose();
}

/*初始化一些必要環境*/
void MainWindow::_Init()
{
    connect(ui->toolButton_open,  &QToolButton::clicked, this, &MainWindow::_onOpen);
    connect(ui->toolButton_close, &QToolButton::clicked, this, &MainWindow::_onClose);
    connect(ui->toolButton_send,  &QToolButton::clicked, this, &MainWindow::_onSendData);
}

/*開啟串列埠*/
void MainWindow::_onOpen()
{
    _serial = new QSerialPort();

    /*選擇資訊*/
    const QString portname = ui->comboBox_com->currentText();
    const QString baudRate = ui->comboBox_baudrate->currentText();
    const QString data     = ui->comboBox_data->currentText();
    const QString stop     = ui->comboBox_stop->currentText();
    const QString polarity = ui->comboBox_polarity->currentText();

    /*設定串列埠名*/
    _serial->setPortName(portname);

    /*波特率*/
    if(baudRate == "9600"){
        _serial->setBaudRate(QSerialPort::Baud9600);
    }
    else if(baudRate == "38400"){
        _serial->setBaudRate(QSerialPort::Baud38400);
    }

    /*資料位*/
    if(data == "5"){
        _serial->setDataBits(QSerialPort::Data5);
    }
    else if(data == "6"){
        _serial->setDataBits(QSerialPort::Data6);
    }
    else if(data == "7"){
        _serial->setDataBits(QSerialPort::Data7);
    }
    else if(data == "8"){
        _serial->setDataBits(QSerialPort::Data8);
    }

    /*停止位*/
    if(stop == "1"){
        _serial->setStopBits(QSerialPort::OneStop);
    }
    else if(stop == "1.5"){
        _serial->setStopBits(QSerialPort::OneAndHalfStop);
    }
    else if(stop == "2"){
        _serial->setStopBits(QSerialPort::OneStop);
    }

    /*校驗位*/
    if(polarity == "無"){
        _serial->setParity(QSerialPort::NoParity);
    }
    else if(polarity == "奇校驗"){
        _serial->setParity(QSerialPort::EvenParity);
    }
    else if(polarity == "偶校驗"){
        _serial->setParity(QSerialPort::OddParity);
    }

    /*開始開啟串列埠*/
    if(!_serial->open(QIODevice::ReadWrite)){
        QMessageBox::warning(this, "警告", "串列埠開啟失敗!");
        return;
    }

    ui->toolButton_open->setEnabled(false);
    connect(_serial, &QSerialPort::readyRead, this, &MainWindow::_onSerialDatas);
}

/*關閉串列埠*/
void MainWindow::_onClose()
{
    if(_serial != nullptr){
        _serial->close();
        delete _serial;
        _serial = nullptr;
        ui->toolButton_open->setEnabled(true);
    }

}

/*傳送串列埠資料*/
void MainWindow::_onSendData()
{
    if(_serial != nullptr){
        QByteArray datas = ui->lineEdit_send->text().toLocal8Bit();
        _serial->write(datas);
        _serial->waitForBytesWritten(3000);
    }
}

/*接收串列埠資料*/
void MainWindow::_onSerialDatas()
{
    QString datas = _serial->readAll();
    ui->textEdit_rece->append(datas.toLatin1());
}


編譯執行一下,我們的程式碼串列埠助手已經編寫完成了,接下來就是測試一下我們編寫的是否正確!

三測試

執行我們剛剛寫好的串列埠助手,接下來,再開啟另外一個已經測試好的串列埠通訊助手,如果它們兩個串列埠通訊助手都能傳送和接收資料,說明我們編寫的串列埠通訊助手是沒有問題的。

1.先測試傳送功能

由上圖看,我們剛編寫的串列埠通訊助手傳送功能沒有問題!

2.再測試接收功能

由上圖看,我們剛編寫的串列埠通訊助手接收功能沒有問題!

四結束

以上就是記錄學習Qt過程中,第一次做一個小小專案的體驗,雖然看上去沒多大功能,但當時還是很有成就感的!

學無止境,好好努力,致自己,致未來!