Qt實現串口通信總結


注意: Qt5發布之前,Qt實現串口通信一般是采用第三方類庫qextserialport。Qt5發布后自帶了QtSerialPort 能夠支持串口通信。

1、Qextserialport類介紹

     在Qt5之前的版本中並沒有特定的串口控制類,現在大部分人使用的是第三方寫的qextserialport類,本文章主要是講解怎樣利用此類實現串口通信。

2、文件下載地址:

最新文件下載在文章最后!

     http://sourceforge.net/projects/qextserialport/files/

3、文件內容:

    3.1.下載到的文件為qextserialport-1.2win-alpha ,解壓並打開后其內容如下。

   

(1)doc文件夾中的文件內容是QextSerialPort類和QextBaseType的簡單的說明,我們可以使用記事本程序將它們打開。

(2)examples文件夾中是幾個例子程序,可以看一下它的源碼,不過想運行它們好像會出很多問題啊。

(3)html文件夾中是QextSerialPort類的使用文檔。

(4)然后就是剩下的幾個文件了。其中qextserialenumerator.cpp及qextserialenumerator.h文件中定義的QextSerialEnumerator類是用來獲取平台上可用的串口信息的。不過,這個類好像並不怎么好用,而且它不是我們關注的重點,所以下面就不再介紹它了。

 (5)qextserialbase.cpp和qextserialbase.h文件定義了一個QextSerialBase類,win_qextserialport.cpp和win_qextserialport.h文件定義了一個Win_QextSerialPort類,posix_qextserialport.cpp和posix_qextserialport.h文件定義了一個Posix_QextSerialPort類,qextserialport.cpp和qextserialport.h文件定義了一個QextSerialPort類。這個QextSerialPort類就是我們上面所說的那個,它是所有這些類的子類,是最高的抽象,它屏蔽了平台特征,使得在任何平台上都可以使用它。

                                                              

在Windows下是:

qextserialbase.cpp和qextserialbase.h 以及win_qextserialport.cpp和win_qextserialport.h

在Linux下是:

qextserialbase.cpp和qextserialbase.h 以及posix_qextserialport.cpp和posix_qextserialport.h

而在Windows下我們可以使用事件驅動EventDriven方式,也可以使用查詢Polling方式,但是在Linux下我們只能使用查詢Polling方式。

4、串口通信的實現

   4.1  聲明串口對象 :

Win_QextSerialPort  *myCom;      //Windows系統內
Posix_QextSerialPort *myCom;      //Linux系統內

  4.2 串口定義:

//Windows中有兩種查詢模式,一種polling模式,一種EventDriven模式
myCom = new Win_QextSerialPort("COM1",QextSerialBase::Polling);                 //
myCom = new Win_QextSerialPort("COM1",QextSerialBase::EventDriven);
//Linux中只有Polling模式
myCom = new Posix_QextSerialPort("/dev/ttyS0",QextSerialBase::Polling);

    事件驅動方式EventDriven就是使用事件處理串口的讀取,一旦有數據到來,就會發出readyRead()信號,我們可以關聯該信號來讀取串口的數據。在事件驅動的方式下,串口的讀寫是異步的,調用讀寫函數會立即返回,它們不會凍結調用線程。

    查詢方式Polling則不同,讀寫函數是同步執行的,信號不能工作在這種模式下,而且有些功能也無法實現。但是這種模式下的開銷較小。我們需要自己建立定時器來讀取串口的數據。

    在Windows下支持以上兩種模式,而在Linux下只支持Polling模式。

  4.3 串口打開模式

myCom ->open(QIODevice::ReadWrite);    //打開模式
QIODevice::Unbuffered 0x0020 描述
QIODevice::NotOpen 0x0000  
QIODevice::ReadOnly 0x0001  
QIODevice::WriteOnly 0x0002  
QIODevice::ReadWrite ReadOnly | WriteOnly  
QIODevice::Append 0x0004  
QIODevice::Truncate 0x0008  
QIODevice::Text 0x0010  

 

4.4 串口的配置函數

復制代碼
myCom->setBaudRate(BAUD9600);          //波特率設置,我們設置為9600
myCom->setDataBits(DATA_8);            //數據位設置,我們設置為8位數據位
myCom->setParity(PAR_NONE);           //奇偶校驗設置,我們設置為無校驗
myCom->setStopBits(STOP_1);            //停止位設置,我們設置為1位停止位
myCom->setFlowControl(FLOW_OFF);      //控制流

myCom->setTimeout(long);              //設置時間間隔
復制代碼

    setTimeout(long)參數決定了Polling查詢模式的讀取串口的速度。

4.5 串口工作

connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));    //EventDriven模式下才能觸發readyRead()信號
connect(readTimer,SIGNAL(timeout()),this,SLOT(readMyCom()));  //Polling模式定時器觸發timeout()信

4.6 串口讀取數據

QByteArray temp = myCom->readAll();    //返回讀取的字節
int byteLen = myCom->bytesAvailable(); //返回串口緩沖區字節數

4.7 串口寫數據

myCom -> Write(const char * data, qint64 maxSize );          //
myCom -> Write(const char * data );                          //
myCom -> Write(const QByteArray & byteArray);                //
int byteLen = myCom->bytesToWrite();                        //輸出寫數據的字節數
//bytesWritten()信號函數來獲取已經發送的數據的大小。

5、Qt5以后版本QSerialPort介紹

5.1  .pro文件內需要加上如下代碼

QT += serialport               //加在第一行或者第二行

5.2 網上一段利用QSerialPort寫的串口通信代碼(轉自:http://www.doc88.com/p-645858545768.html

復制代碼
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    read_port = new mythread(this);
    connect(this->read_port, SIGNAL(read_port_data()), this,  SLOT(display_data()));
}

Dialog::~Dialog()
{
    //delete this->my_serialport;
    delete ui;
}

void Dialog::on_pushButton_clicked()                   //open serial,打開串口
{
    this->read_port->start();
}

void Dialog::display_data()                            //顯示數據
{
    ui->textBrowser->setText(this->read_port->requestData);
}
復制代碼
復制代碼
//對話框頭文件
#ifndef DIALOG_H
#define DIALOG_H

#include "mythread.h"

namespace Ui 
{
    class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
private slots:
    void on_pushButton_clicked();
    void display_data();
private:
    Ui::Dialog *ui;
    mythread *read_port;
};

#endif // DIALOG_H
復制代碼
復制代碼
#include "mythread.h"

mythread::mythread(QObject *parent) :
    QThread(parent)
{
    my_serialport = new QSerialPort(this);
}

void mythread::run()
{
    this->my_serialport->setPortName("com3");
    this->my_serialport->open(QIODevice::ReadWrite);
    this->my_serialport->setBaudRate(115200);
    this->my_serialport->setDataBits(QSerialPort::Data8);
    this->my_serialport->setParity(QSerialPort::NoParity);
    this->my_serialport->setStopBits(QSerialPort::OneStop);
    this->my_serialport->setFlowControl(QSerialPort::NoFlowControl);

    while(1)
    {
        requestData = "";
        while(this->my_serialport->waitForReadyRead(10))
        {
            requestData += this->my_serialport->readAll();
        }

        if(!requestData.isEmpty())
        {
            emit(this->read_port_data());
            qDebug() << "===============" <<requestData;
        }
    }
}
復制代碼

 6、如何抓取串口數據

6.1 、使用超級終端

    Windows XP之前(包括Windows XP)版本系統自帶,程序位置:

                           開始 ->程序->附件->通訊 ->超級終端。

6.2、使用串口調試助手

      串口調試助手軟件非常多:例如CommAssistant.exe、

3、使用Bus Hound工具(推薦使用)

    下載地址:http://www.xz7.com/dir/208/248/200604121464.html

6.4 虛擬串口調試工具

     常用的兩款虛擬串口調試工具:

     1、VSPD下載地址: http://www.cr173.com/soft/21406.html

     2、VSPM下載地址:http://www.onlinedown.net/soft/58180.htm

     通過虛擬軟件,進行虛擬設置后,並以串口調試助手工具配合工作。這樣就可以在沒有物理串口的條件下進行調試測試等。


免責聲明!

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



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