1. 程式人生 > >QT5串列埠編寫

QT5串列埠編寫

首先,QT5是自帶QSerialPort這個類的,使用時需要在pro檔案裡面新增一行:

QT += serialport

然後直接引用標頭檔案就可以使用了。

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

QSerialPort:提供訪問串列埠的功能

QSerialPortInfo:提供系統中存在的串列埠的資訊

接下來需要建立一個QSerialPort的物件,對串列埠的名稱、波特率、資料位、校驗位、停止位等引數進行設定,然後才進行串列埠讀寫操作。
大概總結了一下,設定、讀、寫的過程。

一、設定(舉例):

QSerialPort *serial = new QSerialPort;  
//設定串列埠名  
serial->setPortName(name);  
//開啟串列埠  
serial->open(QIODevice::ReadWrite);  
//設定波特率  
serial->setBaudRate(BaudRate);  
//設定資料位數  
serial->setDataBits(QSerialPort::Data8);  
 //設定奇偶校驗  
 serial->setParity(QSerialPort::NoParity);   
//設定停止位  
serial->setStopBits(QSerialPort::OneStop); //設定流控制 serial->setFlowControl(QSerialPort::NoFlowControl);

這裡設定了串列埠名為name,開啟串列埠並設定為可讀可寫,波特率為BaudRate,資料位為8位,沒有奇偶校驗位,停止位為1位,沒有流控制。設定完這些就能進行讀寫操作了。作為一名新手,發現遇到不懂得可以在QtCreator裡面可以選擇關鍵字,按F1開啟文件看類、函式等資料的手冊。

二、讀取資料

void MainWindow::Read_Data()  
{  
    QByteArray buf;  
    buf =
serial->readAll(); }

三、傳送資料

serial->write(data); 

使用write函式便可以把字串data一個個位元組傳送出去。

使用串列埠就只需以上步驟,使用完後只需要執行

serial->close(); 

就可以關閉串列埠了。

完整程式碼:

//mianwindow.h  
#ifndef MAINWINDOW_H  
#define MAINWINDOW_H  
#include <QMainWindow>  
#include <QDebug>  
#include <QtSerialPort/QSerialPort>  
#include <QtSerialPort/QSerialPortInfo>  
namespace Ui {  
class MainWindow;  
}  
class MainWindow : public QMainWindow  
{  
    Q_OBJECT  
public:  
    explicit MainWindow(QWidget *parent = 0);  
    ~MainWindow();  
private slots:  
    void on_clearButton_clicked();  
    void on_sendButton_clicked();  
    void on_openButton_clicked();  
    void Read_Data();  
private:  
    Ui::MainWindow *ui;  
    QSerialPort *serial;  
};  
#endif // MAINWINDOW_H  
//mainwindow.c  
#include "mainwindow.h"  
#include "ui_mainwindow.h"  

MainWindow::MainWindow(QWidget *parent) :  
    QMainWindow(parent),  
    ui(new Ui::MainWindow)  
{  
    ui->setupUi(this);  
    //查詢可用的串列埠  
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())  
    {  
        QSerialPort serial;  
        serial.setPort(info);  
        if(serial.open(QIODevice::ReadWrite))  
        {  
            ui->PortBox->addItem(serial.portName());  
            serial.close();  
        }  
    }  
    //設定波特率下拉選單預設顯示第三項  
    ui->BaudBox->setCurrentIndex(3);  
    //關閉傳送按鈕的使能  
    ui->sendButton->setEnabled(false);  
    qDebug() << tr("介面設定成功!");  
}  
MainWindow::~MainWindow()  
{  
    delete ui;  
}  
//清空接受視窗  
void MainWindow::on_clearButton_clicked()  
{  
    ui->textEdit->clear();  
}  
//傳送資料  
void MainWindow::on_sendButton_clicked()  
{  
    serial->write(ui->textEdit_2->toPlainText().toLatin1());  
}  
//讀取接收到的資料  
void MainWindow::Read_Data()  
{  
    QByteArray buf;  
    buf = serial->readAll();  
    if(!buf.isEmpty())  
    {  
        QString str = ui->textEdit->toPlainText();  
        str+=tr(buf);  
        ui->textEdit->clear();  
        ui->textEdit->append(str);  
    }  
    buf.clear();  
}  
void MainWindow::on_openButton_clicked()  
{  
    if(ui->openButton->text()==tr("開啟串列埠"))  
    {  
        serial = new QSerialPort;  
        //設定串列埠名  
        serial->setPortName(ui->PortBox->currentText());  
        //開啟串列埠  
        serial->open(QIODevice::ReadWrite);  
        //設定波特率  
        serial->setBaudRate(ui->BaudBox->currentText().toInt());  
        //設定資料位數  
        switch(ui->BitNumBox->currentIndex())  
        {  
        case 8: serial->setDataBits(QSerialPort::Data8); break;  
        default: break;  
        }  
        //設定奇偶校驗  
        switch(ui->ParityBox->currentIndex())  
        {  
        case 0: serial->setParity(QSerialPort::NoParity); break;  
        default: break;  
        }  
        //設定停止位  
        switch(ui->StopBox->currentIndex())  
        {  
        case 1: serial->setStopBits(QSerialPort::OneStop); break;  
        case 2: serial->setStopBits(QSerialPort::TwoStop); break;  
        default: break;  
        }  
        //設定流控制  
        serial->setFlowControl(QSerialPort::NoFlowControl);  
        //關閉設定選單使能  
        ui->PortBox->setEnabled(false);  
        ui->BaudBox->setEnabled(false);  
        ui->BitNumBox->setEnabled(false);  
        ui->ParityBox->setEnabled(false);  
        ui->StopBox->setEnabled(false);  
        ui->openButton->setText(tr("關閉串列埠"));  
        ui->sendButton->setEnabled(true);  
        //連線訊號槽  
        QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data);  
    }  
    else  
    {  
        //關閉串列埠  
        serial->clear();  
        serial->close();  
        serial->deleteLater();  
        //恢復設定使能  
        ui->PortBox->setEnabled(true);  
        ui->BaudBox->setEnabled(true);  
        ui->BitNumBox->setEnabled(true);  
        ui->ParityBox->setEnabled(true);  
        ui->StopBox->setEnabled(true);  
        ui->openButton->setText(tr("開啟串列埠"));  
        ui->sendButton->setEnabled(false);  
    }  
}