基於多執行緒技術的非同步序列通訊應用

2021-06-16 02:02:41 字數 3344 閱讀 9815

1  引言

在工業控制領域,由於序列介面簡單、使用方便,從而使得非同步序列通訊成為計算機之間極為常用的通訊手段。c++ builder 6是borland公司推出的快速應用程式開發平台,它採用物件導向的c++作為開發語言,同時提供了良好的視覺化開發環境,是目前開發windows應用程式的強大、高效的開發平台之一。在基於windows 2000的多工操作平台下的控制系統中,利用c++ builder的多執行緒技術實現序列通訊可以增強控制程式的執行效率,保證控制的準確性和健壯性。

2  c++ builder下的多執行緒開發

多執行緒應用程式是包含數個同時執行的執行緒的應用程式,c++ builder中的tthread提供了用於簡化編寫多執行緒應用程式的物件,大大簡化了編寫多執行緒程式的難度。這些物件通過避免瓶頸、組織程式和多道處理等方式來增強程式的功能。

2.1  定義執行緒物件

要在應用程式中使用執行緒物件,必須建立tthread的乙個新的派生類。可從主選單中選擇file|new來建立tthread的乙個派生類,在新對話方塊中,選擇thread object,系統會提示為新執行緒物件提供類名。在提供名字之後,c++ builder建立乙個新的.cpp和標頭檔案以實現執行緒。自動生成的.cpp檔案中包含關於新執行緒的**框架,若將執行緒命名為tmythread,則. cpp檔案如下所示:

//--------------------------------

#include 

#include pragma hdrstop

#include 「unit2.h」

__fastcall tmythread::tmythread(bool createsuspended):tthread(createsuspended)

//--------------------------------

void __fastcall tmythread::execute()

//--------------------------------

在此段**中,首先需要使用建構函式來初始化新執行緒類,一般是為執行緒分配預設的優先順序,並可指定執行緒是否在執行完成後自動釋放。之後在execute方法中編寫執行緒函式實現任務。

2.2  執行執行緒物件

當定義execute方法實現執行緒類後,可在應用程式中使用它來啟動execute方法的**。要使用執行緒,首先建立執行緒類的乙個例項。可以建立立即開始執行的執行緒例項,或建立乙個處於臨時中斷狀態的執行緒,只在呼叫resume方法時開始。要建立乙個立即開始執行的執行緒例項,將建構函式的 createsuspended引數設為false。例如,下列**建立乙個執行緒並開始執行:tmythread *secondpreocess = new tmythread(false); //create and run the thread,在完成執行之前執行緒可被隨意開始和停止,要結束或者臨時停止執行緒,呼叫他們的terminate或者suspend方法。需繼續時,呼叫 resume方法。

2.3  協調執行緒

當編寫執行緒執**時,必須考慮到可能同步執行的其他執行緒的行為。特別要避免兩個執行緒試圖同時使用相同的全域性物件或變數;另一方面,乙個執行緒中**可能會依賴其他執行緒所執行任務的結果。在c+ + builder中,系統均提供了相應的機制來協調執行緒間的行為,達到避免衝突並發揮多執行緒優點的目的。

3  多執行緒方式下的序列通訊

利用c++ builder開發串列埠通訊軟體一般有兩種方法:其一是利用windows的api函式,其二是採用微軟的mscomm控制項。相對於api函式的方式, mscomm控制項使用簡單,但可靠性差一些,另外考慮到系統的相容性和可移植性,推薦使用windows的api函式來開發相關的串列埠通訊軟體。除了上述兩種開發方式以外,開發者還可以使用第三方軟體**商針對c++ builder開發的專用的序列通訊元件,這些元件其實已經把windows api函式以及多執行緒程式設計封裝在其中,對使用者而言只需要像使用普通元件一樣來使用它們。但這種方式下,開發者受制於第三方元件的應用條件和功能,不利於自己的功能擴充套件。

除了少量簡單應用外,要利用windows api函式實現序列通訊就必須採用多執行緒技術。使用多執行緒實現序列通訊需要建立幾個相關的執行緒,除了主線程以外,還包括串列埠監控執行緒,串列埠監控執行緒也可以單獨建立為串列埠讀執行緒和串列埠寫執行緒。主線程即系統主程式,一般情況下就是這個主線程被提取到cpu執行,它負責系統功能的實現,同時也完成對串列埠的開啟、關閉和初始化;當主線程在cpu執行時,應用程式還可以建立監控執行緒,用以監測串列埠的狀態變化,對發生的串列埠事件做出反應。如果整個系統對串列埠的讀寫操作不會發生衝突,那麼就可以把串列埠讀執行緒和串列埠寫執行緒合併到監控執行緒中,在監控執行緒中完成串列埠資料的讀寫操作。主線程中建立的執行緒都有各自的執行週期,監控執行緒的生命期的長短取決於主線程的功能要求。

多執行緒方式下,系統的功能塊被明確地分開,各個執行緒完成各自的工作,這樣的設計使得執行緒之間的協調和同步變得尤為重要,所以,在多執行緒程式設計中,執行緒之間的同步問題是乙個設計的難點。

4  應用例項

下面給出了乙個利用序列口進行高速資料採集的應用系統例項,該系統完成對某集群通道通訊資料的採集工作。系統中的pc機要實時接收下位機所傳送的大量資料,並完成對資料的實時儲存;pc機對下發的資料很少,且是在串列埠資料接收、儲存並處理完畢後才傳送乙個命令訊號給下位機。由於系統實時性的要求,本文採用了多執行緒機制來分別實現pc機的序列通訊功能和後台的資料處理功能,微控制器作為下位機完成對資料採集裝置的控制並完成對pc機的資料傳輸。

4.1  pc機通訊模組

根據上述的系統功能描述,在應用程式中建立乙個串列埠監控執行緒,用於讀串列埠,完成序列資料接收;因為下發的資料量很小,所以寫串列埠的操作在主線程中完成就可以了。主線程的功能是完成對串列埠的操作,對資料的儲存和處理以及提供良好的人機介面。串列埠監控執行緒的功能是完成對串列埠的實時監控,捕捉串列埠事件,完成資料接收,並通過訊息機制向主線程傳送接收到的資料。為了方便對串列埠進行操作,系統設計了乙個串列埠類,封裝了同操作串列埠通訊相關的windows的api函式。

主線程的程式流程如圖1所示:

圖1     主線程程式流程圖

監控執行緒的程式流程如圖2所示:

圖2     監控執行緒的程式流程圖

4.2  微控制器通訊模組

微控制器和集群通道資料來源的連線和處理部分在本文中略去,只給出微控制器的序列通訊實現部分。微控制器採用89c51,其序列介面工作於方式3,smod=0,採用11.0592mhz的晶振實現 9600波特率的通訊速率,定時器/計數器1工作在方式2(自動重裝載方式)。下面給出微控制器序列連線部分的軟體流程圖,如圖3所示:

圖3     微控制器序列通訊流程圖

5  結束語

越來越多的控制平台開始基於windows系統,有效而充分地利用windows的多工機制可以滿足控制系統的諸多要求。在利用序列通訊的控制系統中,及時把被控物件的資訊反饋給控制器,以及在控制端完成中間資料處理過程並實施新的控制命令都需要序列口高速、有效和可靠地工作。實踐證明,多執行緒技術應用於非同步序列通訊對於提高上述的高速資料採集系統的穩定性和靈活性具有重要的意義。

C 多執行緒技術總結(非同步)

我這裡針對現有的c 多執行緒技術進行乙個彙總,一是複習,二是方便索引,文章部份知識點 於網路,非本人原創。一 並行 非同步 1.system.threading.tasks命名空間下的 tpl 1.1 parallel.invoke 並行執行多個任務,主線程等待並行執行完畢後才開始續續執行。示例 s...

基於TCP的Socket通訊 多執行緒

中引用的頭函式 include include include pragma comment lib,ws2 32.lib 伺服器端 1.初始化socket環境,建立套接字 wsadata wsadata word wversionrequested makeword 2,2 將兩個byte型合成乙...

ACE多執行緒技術和OCCI連線池技術的應用測試

主要功能是使用資料庫連線池和多執行緒技術用occi訪問oracle,貼出來和大家共同學習.undef ace has standard cpp library define ace has standard cpp library 1 include ace os.h include ace log...