Qt編寫串列埠通訊程式全程圖文講解(二)

洛欣發表於2010-05-18

上一篇文章中已經介紹了實現最簡單的串列埠接收程式的編寫,這篇將對程式內容進行分析。

1.首先應說明操作串列埠的流程。

步驟一:設定串列埠引數,如:波特率,資料位,奇偶校驗,停止位,資料流控制等。

步驟二:選擇串列埠,如windows下的串列埠1為“com1”,Linux下為“ttyS0”等。

步驟三:讀或寫串列埠。

步驟四:關閉串列埠。

(我們上一個程式沒有寫串列埠和關閉串列埠的功能,開啟串列埠也是在建構函式裡完成的,因為那只是為了用最簡單的方法完成串列埠程式的編寫。在以後的文章裡我們將會對它進行修改和完善。)

2.下面我們將按照上面的操作串列埠的流程,講解第一個程式的編寫。

第一,我們在寫程式之前,應該瀏覽一下那6個檔案,大概看一下它們裡面都是什麼內容,各個檔案各個類之間有什麼聯絡。在win_qextserialport.cpp檔案中,我們看它的最後一個建構函式,會發現,串列埠可以在這裡進行初始化。

 


Win_QextSerialPort::Win_QextSerialPort(const QString & name, const PortSettings& settings, QextSerialBase::QueryMode mode) {

Win_Handle=INVALID_HANDLE_VALUE;

setPortName(name);

setBaudRate(settings.BaudRate);

setDataBits(settings.DataBits);

setStopBits(settings.StopBits);

setParity(settings.Parity);

setFlowControl(settings.FlowControl);

setTimeout(settings.Timeout_Millisec);

setQueryMode(mode);

init();

}

它共有三個引數,其中第一個引數const QString & name,應該是串列埠的名字,是QString型別,我們可以用串列埠1即“com1”,不用過多說明。下面我們主要研究第二個和第三個引數。

第二,我們檢視第二個引數的位置。

在Qt Creator的選單中選擇Edit->Find/Replace->All projects,如下圖。

 

在彈出的對話方塊中輸入要查詢的內容PortSettings,如下圖。

 

點選Search後,便能在下面顯示出整個工程中所有PortSettings的位置。如下圖。

 

我們點選第一條,可以看到在qextserialbase.h檔案中有一個struct PortSettings,如下圖。

 


我們雙擊這一條,進入相應的檔案。如下圖。

 

struct PortSettings

{

BaudRateType BaudRate;

DataBitsType DataBits;

ParityType Parity;

StopBitsType StopBits;

FlowType FlowControl;

long Timeout_Millisec;

};

 

可以看到在這個結構體裡定義了串列埠初始化的各個引數,而對於BaudRateType等型別的定義,我們在這個結構體的上面可以看到,它們是多個列舉變數。如下圖。


這時我們便應該明白了,這個結構體便是實現串列埠引數設定的。

 

 

 

 

 

 

 

 

第三,定義串列埠引數。

 

 

 

 

 

 

BaudRateType BaudRate;

波特率設定,我們設定為9600,即程式中用BAUD9600;

 

DataBitsType DataBits;

資料位設定,我們設定為8位資料位,即DATA_8;

 

ParityType Parity;

奇偶校驗設定,我們設定為無校驗,即PAR_NONE;

 

StopBitsType StopBits;

停止位設定,我們設定為1位停止位,即STOP_1;

 

FlowType FlowControl;

資料流控制設定,我們設定為無資料流控制,即FLOW_OFF;

 

long Timeout_Millisec;

延時設定,我們設定為延時500ms,即500;

 

這樣便寫出了程式中的那句:

struct PortSettings myComSetting = {BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};

我們定義了一個結構體變數myComSetting,並對其進行了初始化。

 

 

 

 

 

 

第四,設定第三個引數。

 

 

 

我們先按上面的方法找到它的定義位置,在qextserialbase.h中,如下圖。

 

可以看到查詢模式也是列舉變數,有兩個選項,我們選擇第二個EventDriven,事件驅動。

 

到這裡,我們就可以定義Win_QextSerialPort類的變數了,就是那句:

 

myCom = new Win_QextSerialPort("com1",myComSetting,QextSerialBase::EventDriven);

它完成了串列埠的選擇和串列埠的初始化。

 

 

 

 

 

 

 

第五,寫開啟串列埠函式和讀串列埠函式。

 

 

 

檢視win_qextserialport.h檔案,我們會發現Win_QextSerialPort類繼承自QextSerialBase類。

 

檢視qextserialbase.h檔案,我們會發現QextSerialBase類繼承自QIODevice 類。

 

我們在Qt的幫助中檢視QIODevice 類,如下圖。

 

其部分內容如下圖。可以看到其中有enum OpenModeFlag { NotOpen, ReadOnly, WriteOnly, ReadWrite, ..., Unbuffered },virtual bool open ( OpenMode mode ),QByteArray readAll ()等內容。

 

而下面的訊號函式中有void readyRead ();它可以檢視串列埠是否有新的資料傳來。

 


所以,我們可以用這個類裡的這些函式操作串列埠。

 

 

如程式中的語句:

 

 

myCom ->open(QIODevice::ReadWrite);

//我們呼叫了其中的open函式,用ReadWrite可讀寫的方式進行開啟串列埠;

 

connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));

//我們關聯訊號readyRead(),和自己寫的槽函式readMyCom(),當串列埠有資料傳來時進行讀串列埠操作。

 

 

void MainWindow::readMyCom() //自己寫的讀串列埠函式

{

QByteArray temp = myCom->readAll();

//我們呼叫readAll()函式,讀取串列埠中所有資料,在上面可以看到其返回值是QByteArray型別。

ui->textBrowser->insertPlainText(temp);

//呼叫insertPlainText()函式,是視窗上的文字瀏覽器中連續輸出資料,而不是每次寫資料前都清除以前的

//資料,可以在Qt的幫助裡檢視這個函式的說明

}

 

 

 

 

 

 

 

這樣我們便寫完了所有的語句,最後只需要在mainwindow.h檔案中加入相應的標頭檔案,物件宣告,函式宣告即可。

 

 

 

 

      這裡需要說明的是我們一定要學會檢視檔案和使用幫助文件,將我們不懂得知識一點一點搞明白。

      在下一篇中我們將會加入“開啟串列埠”,“關閉串列埠”,“傳送資料”三個按鈕,將整個程式進行完善。

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/lbsljn/archive/2009/12/13/4994826.aspx

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22785983/viewspace-662975/,如需轉載,請註明出處,否則將追究法律責任。

相關文章