Qt實現串口通訊總結

注意: Qt5發佈以前,Qt實現串口通訊通常是採用第三方類庫qextserialport。Qt5發佈後自帶了QtSerialPort 可以支持串口通訊。html

一、Qextserialport類介紹異步

     在Qt5以前的版本中並無特定的串口控制類,如今大部分人使用的是第三方寫的qextserialport類,本文章主要是講解怎樣利用此類實現串口通訊。函數

二、文件下載地址:工具

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

三、文件內容:ui

    3.1.下載到的文件爲qextserialport-1.2win-alpha ,解壓並打開後其內容以下。this

  

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

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

(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.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()信號函數來獲取已經發送的數據的大小。

五、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.1 、使用超級終端

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

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

6.二、使用串口調試助手

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

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

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

6.4 虛擬串口調試工具

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

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

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

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