通過好幾天的學習,終於寫出了一個用於串口通信的上位機。下面開始介紹串口類的使用。
首先,QT5是自帶QSerialPort這個類的,使用時需要在pro文件里面添加一行:
QT += serialport
然后直接引用頭文件就可以使用了。
#include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo>
QSerialPort:提供訪問串口的功能
QSerialPortInfo:提供系統中存在的串口的信息
接下來需要創建一個QSerialPort的對象,對串口的名稱、波特率、數據位、校驗位、停止位等參數進行設置,然后才進行串口讀寫操作。
大概總結了一下,設置、讀、寫的過程。
一、設置(舉例)
1 QSerialPort *serial = new QSerialPort; 2 //設置串口名
3 serial->setPortName(name); 4 //打開串口
5 serial->open(QIODevice::ReadWrite); 6 //設置波特率
7 serial->setBaudRate(BaudRate); 8 //設置數據位數
9 serial->setDataBits(QSerialPort::Data8); 10 //設置奇偶校驗
11 serial->setParity(QSerialPort::NoParity); 12 //設置停止位
13 serial->setStopBits(QSerialPort::OneStop); 14 //設置流控制
15 serial->setFlowControl(QSerialPort::NoFlowControl);
這里設置了串口名為name,打開串口並設置為可讀可寫,波特率為BaudRate,數據位為8位,沒有奇偶校驗位,停止位為1位,沒有流控制。設置完這些就能進行讀寫操作了。作為一名新手,發現遇到不懂得可以在QtCreator里面可以選擇關鍵字,按F1打開文檔看類、函數等數據的手冊。
二、讀取數據
1 void MainWindow::Read_Data() 2 { 3 QByteArray buf; 4 buf = serial->readAll(); 5 }
當串口收到數據並且接收完畢后,會發出一個readyRead()的信號,因此只需要編寫一個槽函數Read_Data(),設置信號槽,並在槽函數中使用readAll()把收到的數據讀到buf中。
三、發送數據
serial->write(data);
使用write函數便可以把字符串data一個個字節發送出去。
使用串口就只需以上步驟,使用完后只需要執行
serial->close();
就可以關閉串口了。我使用了ui界面設計來編寫上位機的,界面如下:
代碼如下:
1 //mianwindow.h
2 #ifndef MAINWINDOW_H 3 #define MAINWINDOW_H
4 #include <QMainWindow>
5 #include <QDebug>
6 #include <QtSerialPort/QSerialPort>
7 #include <QtSerialPort/QSerialPortInfo>
8 namespace Ui { 9 class MainWindow; 10 } 11 class MainWindow : public QMainWindow 12 { 13 Q_OBJECT 14 public: 15 explicit MainWindow(QWidget *parent = 0); 16 ~MainWindow(); 17 private slots: 18 void on_clearButton_clicked(); 19 void on_sendButton_clicked(); 20 void on_openButton_clicked(); 21 void Read_Data(); 22 private: 23 Ui::MainWindow *ui; 24 QSerialPort *serial; 25 }; 26 #endif // MAINWINDOW_H
1 //mainwindow.c
2 #include "mainwindow.h"
3 #include "ui_mainwindow.h"
4
5 MainWindow::MainWindow(QWidget *parent) : 6 QMainWindow(parent), 7 ui(new Ui::MainWindow) 8 { 9 ui->setupUi(this); 10 //查找可用的串口
11 foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) 12 { 13 QSerialPort serial; 14 serial.setPort(info); 15 if(serial.open(QIODevice::ReadWrite)) 16 { 17 ui->PortBox->addItem(serial.portName()); 18 serial.close(); 19 } 20 } 21 //設置波特率下拉菜單默認顯示第三項
22 ui->BaudBox->setCurrentIndex(3); 23 //關閉發送按鈕的使能
24 ui->sendButton->setEnabled(false); 25 qDebug() << tr("界面設定成功!"); 26 } 27 MainWindow::~MainWindow() 28 { 29 delete ui; 30 } 31 //清空接受窗口
32 void MainWindow::on_clearButton_clicked() 33 { 34 ui->textEdit->clear(); 35 } 36 //發送數據
37 void MainWindow::on_sendButton_clicked() 38 { 39 serial->write(ui->textEdit_2->toPlainText().toLatin1()); 40 } 41 //讀取接收到的數據
42 void MainWindow::Read_Data() 43 { 44 QByteArray buf; 45 buf = serial->readAll(); 46 if(!buf.isEmpty()) 47 { 48 QString str = ui->textEdit->toPlainText(); 49 str+=tr(buf); 50 ui->textEdit->clear(); 51 ui->textEdit->append(str); 52 } 53 buf.clear(); 54 } 55 void MainWindow::on_openButton_clicked() 56 { 57 if(ui->openButton->text()==tr("打開串口")) 58 { 59 serial = new QSerialPort; 60 //設置串口名
61 serial->setPortName(ui->PortBox->currentText()); 62 //打開串口
63 serial->open(QIODevice::ReadWrite); 64 //設置波特率
65 serial->setBaudRate(ui->BaudBox->currentText().toInt()); 66 //設置數據位數
67 switch(ui->BitNumBox->currentIndex()) 68 { 69 case 8: serial->setDataBits(QSerialPort::Data8); break; 70 default: break; 71 } 72 //設置奇偶校驗
73 switch(ui->ParityBox->currentIndex()) 74 { 75 case 0: serial->setParity(QSerialPort::NoParity); break; 76 default: break; 77 } 78 //設置停止位
79 switch(ui->StopBox->currentIndex()) 80 { 81 case 1: serial->setStopBits(QSerialPort::OneStop); break; 82 case 2: serial->setStopBits(QSerialPort::TwoStop); break; 83 default: break; 84 } 85 //設置流控制
86 serial->setFlowControl(QSerialPort::NoFlowControl); 87 //關閉設置菜單使能
88 ui->PortBox->setEnabled(false); 89 ui->BaudBox->setEnabled(false); 90 ui->BitNumBox->setEnabled(false); 91 ui->ParityBox->setEnabled(false); 92 ui->StopBox->setEnabled(false); 93 ui->openButton->setText(tr("關閉串口")); 94 ui->sendButton->setEnabled(true); 95 //連接信號槽
96 QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data); 97 } 98 else
99 { 100 //關閉串口
101 serial->clear(); 102 serial->close(); 103 serial->deleteLater(); 104 //恢復設置使能
105 ui->PortBox->setEnabled(true); 106 ui->BaudBox->setEnabled(true); 107 ui->BitNumBox->setEnabled(true); 108 ui->ParityBox->setEnabled(true); 109 ui->StopBox->setEnabled(true); 110 ui->openButton->setText(tr("打開串口")); 111 ui->sendButton->setEnabled(false); 112 } 113 }
1 //main.c
2 #include "mainwindow.h"
3 #include <QApplication>
4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 MainWindow w; 8 w.show(); 9 return a.exec(); 10 }