注意: 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
經過虛擬軟件,進行虛擬設置後,並以串口調試助手工具配合工做。這樣就能夠在沒有物理串口的條件下進行調試測試等。