QT學習——QT5串列埠編寫的上位機
阿新 • • 發佈:2019-02-10
最近自己學習了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
執行後的結果為: