Qt 串口收發數據


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

首先,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 } 

 


免責聲明!

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



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