通過好幾天的學習,終於寫出了一個用於串口通信的上位機。下面開始介紹串口類的使用。
首先,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(); }