深入淺出Win32多執行緒程式設計之綜合例項 1

2021-04-18 09:33:26 字數 1979 閱讀 6277

本章我們將以工業控制和嵌入式系統中運用極為廣泛的串列埠通訊為例講述多執行緒的典型應用。 而網路通訊也是多執行緒應用最廣泛的領域之一,所以本章的最後一節也將對多執行緒網路通訊進行簡短的描述。1.串列埠通訊在工業控制系統中,工控機(一般都基於pc windows平台)經常需要與微控制器通過串列埠進行通訊。因此,操作和使用pc的串列埠成為大多數微控制器、嵌入式系統領域工程師必須具備的能力。 串列埠的使用需要通過三個步驟來完成的: (1) 開啟通訊埠; (2) 初始化串列埠,設定波特率、資料位、停止位、奇偶校驗等引數。為了給讀者乙個直觀的印象,下圖從windows的"控制面板->系統->裝置管理器->通訊埠(com1)"開啟com的設定視窗:

(3) 讀寫串列埠。 在win32平台下,對通訊埠進行操作跟基本的檔案操作一樣。 建立/開啟com資源 下列函式如果呼叫成功,則返回乙個標識通訊埠的控制代碼,否則返回-1:

hadle createfile(pctstr lpfilename, //通訊埠名,如"com1" word dwdesiredaccess, //對資源的訪問型別 word dwsharemode, //指定共享模式,com不能共享,該引數為0 psecurity_attributes lpsecurityattributes, //安全描述符指標,可為null word dwcreationdisposition, //建立方式 word dwflagsandattributes, //檔案屬性,可為null handle htemplatefile //模板檔案控制代碼,置為null );

bool winapi getcommstate( handle hfile, //標識通訊埠的控制代碼 lpdcb lpdcb //指向乙個裝置控制塊(dcb結構)的指標 );

如果要調整通訊埠的引數,則需要重新配置裝置控制塊,再用win32 api setcommstate()函式進行設定:

bool setcommstate( handle hfile, //標識通訊埠的控制代碼 lpdcb lpdcb //指向乙個裝置控制塊(dcb結構)的指標 );

dcb結構包含了串列埠的各項引數設定,如下:

typedef struct _dcb dcb;

讀寫串列埠 在讀寫串列埠之前,還要用purgecomm()函式清空緩衝區,並用setcommmask ()函式設定事件掩模來監視指定通訊埠上的事件,其原型為:

bool setcommmask( handle hfile, //標識通訊埠的控制代碼 dword dwevtmask //能夠使能的通訊事件 );

串列埠上可能發生的事件如下表所示:

值 事件描述

ev_break

a break was detected on input.

ev_cts

the cts (clear-to-send) signal changed state.

ev_dsr

the dsr(data-set-ready) signal changed state.

ev_err

a line-status error occurred. line-status errors are ce_frame, ce_overrun, and ce_rxparity.

ev_ring

a ring indicator was detected.

ev_rlsd

the rlsd (receive-line-signal-detect) signal changed state.

ev_rxchar

a character was received and placed in the input buffer.

ev_rxflag

ev_txempty

the last character in the output buffer was sent.

在設定好事件掩模後,我們就可以利用waitcommevent()函式來等待串列埠上發生事件,其函式原型為:

我們可以在發生事件後,根據相應的事件型別,進行串列埠的讀寫操作:

深入淺出Win32多執行緒程式設計之 五 綜合例項

本章我們將以工業控制和嵌入式系統中運用極為廣泛的串列埠通訊為例講述多執行緒的典型應用。而網路通訊也是多執行緒應用最廣泛的領域之一,所以本章的最後一節也將對多執行緒網路通訊進行簡短的描述。1.串列埠通訊 在工業控制系統中,工控機 一般都基於pc windows平台 經常需要與微控制器通過串列埠進行通訊...

深入淺出Win32多執行緒設計之MFC的多執行緒(2)

2.執行緒間通訊 mfc中定義了繼承自csyncobject類的ccriticalsection ccevent cmutex csemaphore類封裝和簡化了win32 api所提供的臨界區 事件 互斥和訊號量。使用這些同步機制,必須包含 afxmt.h 標頭檔案。下圖給出了類的繼承關係 作為c...

深入淺出VC 串列埠程式設計之基於Win32 API

1 api描述 在win32 api中,串列埠使用檔案方式進行訪問,其操作的api基本上與檔案操作的api一致。開啟串列埠 win32 中用於開啟串列埠的api 函式為createfile,其原型為 例如,以下程式用於以同步讀寫方式開啟串列埠com1 handle hcom dword dwerro...