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