資源描述:
《串口多線程 衛(wèi)星導航實例》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。
1、單片機在線編程專家VC++】在VC++編程息和事件;工作者線程主要用來處理應用程序的后臺任務。應用程序可以通過調(diào)用AfxBejinThread()函數(shù)自動創(chuàng)建一個CwinThread對象,從而開始一個線程。線程的終止條件有如下4種:線程函數(shù)返回;線程調(diào)用ExitThtead()退出;異常情況下用現(xiàn)成的句柄調(diào)用TerminateThread()退出;線程所屬的進程被終止。3、多線程在RS-322應用3.1串口通信對線程同步因為同一進程的所有線程共享進程的虛擬地址空間,而在WINDOWS中線程是匯編級中斷,所以才有可能實現(xiàn)多個線程同時訪問同一個對象。這些對象可以是
2、全局變量、MFC的對象、MFC的API等。而串口通信對每個串口對象只提供一個緩沖區(qū),發(fā)送接收都要用到這一個緩沖區(qū),所以要求必須建立同步線程執(zhí)行,使得一個時刻只能進行一種線程操作,以免通信出錯。串口通信處理的多個線程需要協(xié)調(diào)運行,一個線程必須等待另一線程結(jié)束才能開始,在處理一個線程的同時必須把其余待處理的線程掛起等待,以減少其余待處理線程對CPU的資源占用,正處理的線程一旦處理結(jié)束則通過線程間的通信發(fā)出信號來擊活被掛起的線程中的一個線程進入處理。VC++提供了以下4個同步對象來協(xié)調(diào)實現(xiàn)多線程的并行:Csemaphore信號燈對象,允許一定數(shù)量的現(xiàn)成訪問某個資源,
3、用來控制訪問共享資源的線程數(shù)量。Cmutex互斥量對象,一個時刻至多只允許一個線程訪問某個資源,未被占用時處于有信號狀態(tài),可實現(xiàn)對共享線程的互斥訪問。Cevent事件對象,用于使一個線程統(tǒng)治其余現(xiàn)成某個事件正發(fā)生,所以可以用來實現(xiàn)禁止對某個資源的訪問,直至該線程結(jié)束釋放資源使資源處于有信號狀態(tài),從而使被掛起的線程被通知得以執(zhí)行CcriticalSection臨界區(qū)對象,將一段代碼置入臨界緩沖區(qū),并只允許一個線程進入執(zhí)行這段代碼,該臨界緩沖區(qū)僅在創(chuàng)建這個緩沖區(qū)的進程中有效。3.2等待為了實現(xiàn)線程在資源對象被占用時把自己掛起而阻塞自己執(zhí)行,等待資源空閑信號停止阻塞
4、繼續(xù)執(zhí)行,從而減少對CPU的資源占用,WIN32API中提供了兩個等待函數(shù)來實現(xiàn)這一功能:WaitForSingleObject()(只可監(jiān)控單個同步對象)WaitForMUultipleObjects(可同時監(jiān)控多個同步對象)。在監(jiān)控系統(tǒng)中,處理串口通信只是CPU的一部分事物,所以必須使用等待函數(shù)提高程序的執(zhí)行效率。3.3的重疊I/O方式MFC對于串口通信是作為文件設備來處理的,用CreateFile()打開串口獲得一個串口句柄。打開后由SetCommState()進行串口端口配置:緩沖區(qū)設置、超時設置、數(shù)據(jù)格式設置等等。設置成功后就可以調(diào)用ReadFile
5、()和WriteFile()進行數(shù)據(jù)的讀與寫,用WaitCommEvent()監(jiān)控通信事件。CloseHandle()用于關閉串口。在ReadFile()和WriteFile()進行串口讀寫時可以采取同步執(zhí)行方式也可以采用重疊I/O方式。由于采用同步執(zhí)行方式,被調(diào)用的函數(shù)必須執(zhí)行結(jié)束后才被返回,這必然要求除正被執(zhí)行線程外其余線程被掛起等待,效率低;而采用重疊I/O方式,被調(diào)用的函數(shù)不必等執(zhí)行結(jié)束后才被返回,而是可以立即返回,因為I/O操作在后臺執(zhí)行,這樣其他線程就不必等待馬上可以進行處理其他事物,實現(xiàn)了不同線程可以在同一串口句柄上基本上接近同時實現(xiàn)讀寫操作,實
6、現(xiàn)重疊,是通信的實時性提高。采用重疊I/O方式,線程必須創(chuàng)建OVERLAPPED結(jié)構(gòu)攻讀寫函數(shù)使用,該結(jié)構(gòu)最重要的成員是hEvent事件句柄。它將作為線程的同步對象使用,讀寫函數(shù)完成時hEvent處于有信號狀態(tài),表示可以進行讀寫操作;讀寫函數(shù)未完成時hEvent被置于無信號狀態(tài)。4、多線程應信程序中的實現(xiàn)應用程序需專門建立一個串口通信類,并在串口通信相關程序段中應用相關函數(shù)實現(xiàn)多線程的應用,下面給出實現(xiàn)多線程應用的的關鍵函數(shù)的核心代碼。1).專門針對COM1的初始化程序段(只寫出涉及多線程應用的關鍵步驟)BOOLInitComm()//串口初始化{HANDLE
7、m_hComm;COMMTIMEOUTSm_CommTimeouts;m_hComm=CreateFile(“COM1”,//這里只使用串口1,如要對多個串口初始化需先在初始化前進入代碼臨界區(qū),以保證在某時刻只對一個串口初始化GENERIC_READ
8、GENRIC_WRITE,//定義串口打開類型為可讀寫0,//以獨占串口資源模式打開串口NULL,//對該串口不設置安全屬性OPEN_EXISTING,FILE_FLAG_OVERLAPPED,//設置重疊I/O模式0;)if(m_hComm==INVALID_HANDLE_VALUE)//串口打開不成功{ret
9、urnFALSE;}m_CommTim