QT5串列埠編寫
阿新 • • 發佈:2019-02-07
首先,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);
}
}