1. 程式人生 > >QT學習——QT5串列埠編寫的上位機

QT學習——QT5串列埠編寫的上位機

      最近自己學習了QT的相關知識和操作,但是卻沒有做過太多的QT專案,之前大多數都是通過MFC去實現一些功能專案,若用QT去實現同樣的東西,其程式設計方法原理都是不會變的,加上覺得自己的指紋系統專案有點單一,所以準備基於QT5做一個串列埠編寫的上位機,實現“軟硬結合”。

      實現串列埠功能,需要我們主要處理好串列埠選擇,波特率大小,停止位,校驗位和串列埠的開閉操作。同時在接收和傳送訊息時我們可以將資料轉換成自己想要的型別。

      下面是實現的程式碼:

       mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

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

private slots:

    void ClearButton_onclick();    //清空接收按鈕槽函式
    void SendButton_onclick();     //傳送資料按鈕槽函式
    void OpenButton_onclick();     //開啟檔案按鈕槽函式
    void Read_Data();              //讀取資料槽函式
};

#endif // MAINWINDOW_H
      mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

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

    //查詢可用的串列埠
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        QSerialPort myserial ;  //串列埠類物件
        myserial.setPort(info);
        if(myserial.open(QIODevice::ReadWrite))
        {
            ui->portcomboBox->addItem(myserial.portName());  //新增串列埠號名字
            myserial.close();
        }
    }
    //設定波特率下拉選單預設顯示第六項
    ui->baoudcomboBox->setCurrentIndex(5);

    //關閉傳送串列埠按鈕的使能
    ui->SendDataButton->setEnabled(false);
    //QDebug()<<tr("介面設定成功!");

    QObject::connect(ui->ClearButton,SIGNAL(clicked()),this,SLOT(ClearButton_onclick()));
    QObject::connect(ui->OpenButton,SIGNAL(clicked()),this,SLOT(OpenButton_onclick()));
    QObject::connect(ui->SendDataButton,SIGNAL(clicked()),this,SLOT(SendButton_onclick()));

}


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


void MainWindow::ClearButton_onclick()    //清除接收功能函式
{
    ui->textEdit->clear();
}


void MainWindow::SendButton_onclick()     //傳送資料功能函式
{
    serial->write(ui->textEdit_2->toPlainText().toLatin1()) ;  //按十六進位制編碼接入文字
}

void MainWindow::OpenButton_onclick()     //開啟串列埠功能函式
{
    if(ui->OpenButton->text()==tr("開啟串列埠"))
    {
        serial = new QSerialPort;

        serial->setPortName(ui->portcomboBox->currentText());   //設定串列埠名

        serial->open(QIODevice::ReadWrite);   //開啟串列埠

        serial->setBaudRate(ui->baoudcomboBox->currentText().toInt());    //設定波特率

        switch(ui->datacomboBox->currentIndex())   //設定資料位數
        {
            case 8: serial->setDataBits(QSerialPort::Data8); break;
            default: break;
        }

        switch(ui->checkcomboBox->currentIndex())   //設定奇偶校驗
        {
            case 0: serial->setParity(QSerialPort::NoParity); break;
            default: break;
        }
        //設定停止位
        switch(ui->stopcomboBox->currentIndex())
        {
            case 1: serial->setStopBits(QSerialPort::OneStop); break;
            case 2: serial->setStopBits(QSerialPort::TwoStop); break;
            default: break;
        }
        //設定流控制
        serial->setFlowControl(QSerialPort::NoFlowControl);

        //關閉設定選單使能
        ui->portcomboBox->setEnabled(false);
        ui->baoudcomboBox->setEnabled(false);
        ui->datacomboBox->setEnabled(false);
        ui->checkcomboBox->setEnabled(false);
        ui->stopcomboBox->setEnabled(false);
        ui->OpenButton->setText(tr("關閉串列埠"));
        ui->SendDataButton->setEnabled(true);

        //連線訊號槽
        QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data);
    }
    else
    {
        //關閉串列埠
        serial->clear();
        serial->close();
        serial->deleteLater();

        //恢復設定使能
        ui->portcomboBox->setEnabled(true);
        ui->baoudcomboBox->setEnabled(true);
        ui->datacomboBox->setEnabled(true);
        ui->checkcomboBox->setEnabled(true);
        ui->stopcomboBox->setEnabled(true);
        ui->OpenButton->setText(tr("開啟串列埠"));
        ui->SendDataButton->setEnabled(false);
    }
}

void MainWindow::Read_Data()      //讀取資料功能函式
{
    QByteArray buf ;
    buf = serial->readAll() ;
    if(!buf.isEmpty())
    {
        QString str = ui->textEdit->toPlainText() ;
        str+=tr(buf) ;

        QByteArray str2 = QByteArray::fromHex (str.toLatin1().data());
        QString strDis;

        QString str3 = str2.toHex().data();    //以十六進位制顯示
        str3 = str3.toUpper ();           //轉換為大寫
        for(int i = 0;i<str3.length ();i+=2)   //填加空格
        {
              QString st = str3.mid (i,2);
              strDis += st;
              strDis += " ";
        }
        //ui->textEdit->clear();
        ui->textEdit->append(strDis);

    }

    buf.clear();
}


      main函式則不需要修改,建立好預設程式碼即可。同時務必記得在.pro檔案中新增
QT       += serialport

      執行後的結果為: