Qt 串口收發數據


通過好幾天的學習,終於寫出了一個用於串口通信的上位機。下面開始介紹串口類的使用。

首先,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(通常為COM XX),打開串口並設置為可讀可寫,波特率為BaudRate,數據位為8位,沒有奇偶校驗位,停止位為1位,沒有流控制。設置完這些就能進行讀寫操作了。作為一名新手,發現遇到不懂得可以在QtCreator里面可以選擇關鍵字,按F1打開文檔看類、函數等數據的手冊。

二、讀取數據

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

當串口收到數據並且接收完畢后,會發出一個readyRead()的信號,因此只需要編寫一個槽函數Read_Data(),設置信號槽,並在槽函數中使用readAll()把收到的數據讀到buf中。

三、發送數據

serial->write(data);  

使用write函數便可以把字符串data一個個字節發送出去。

使用串口就只需以上步驟,使用完后只需要執行

serial->close();

就可以關閉串口了。我使用了ui界面設計來編寫上位機的,界面如下:

 

 代碼如下:

//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);
    }
}

 

//main.c
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM