• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于VC++環(huán)境的串口通信

      2014-04-16 11:52:42
      科技視界 2014年13期
      關(guān)鍵詞:句柄緩沖區(qū)線程

      李 林

      (中國電子科技集團(tuán)公司 第二十研究所,陜西 西安 710068)

      0 引言

      在導(dǎo)航設(shè)備及測試儀器中,顯控計(jì)算機(jī)(一般都基于Windows平臺)經(jīng)常需要與下層DSP設(shè)備模塊通過串口進(jìn)行通信。串口通信方便易行,應(yīng)用廣泛。一般情況下,顯控計(jì)算機(jī)通過RS232總線進(jìn)行通信.RS232的通信方式是雙工的。每次通信都是由顯控計(jì)算機(jī)通過串口向DSP設(shè)備模塊命令,DSP設(shè)備模塊在接收到正確的命令后作出應(yīng)答.在Win32下,可以使用兩種編程方式實(shí)現(xiàn)串口通信,其一是使用ActiveX控件,這種方法程序簡單,但欠靈活.其二是調(diào)用Windows的API函數(shù),這種方法可以清楚地掌握串口通信的機(jī)制,并且自由靈活。本文使用API串口通信。串口的操作可以有兩種操作方式:同步操作方式和重疊操作方式(又稱為異步操作方式)。同步操作時(shí),API函數(shù)會阻塞直到操作完成以后才能返回(在多線程方式中,雖然不會阻塞主線程,但是仍然會阻塞監(jiān)聽線程);而重疊操作方式,API函數(shù)會立即返回,操作在后臺進(jìn)行,避免線程的阻塞.無論哪種操作方式,一般都通過四個(gè)步驟來完成:(1)打開串口;(2)配置串口;(3)讀寫串口;(4)關(guān)閉串口。

      1 打開串口

      Win32系統(tǒng)把文件的概念進(jìn)行了擴(kuò)展.無論是文件、通信設(shè)備、命名管道、郵件槽、磁盤、還是控制臺,都是用API函數(shù)CreateFile來打開或創(chuàng)建的。該函數(shù)的原型為:

      2 配置串口

      在打開串口設(shè)備句柄后,常需要對串口進(jìn)行一些初始化配置工作.這需要通過一個(gè)DCB結(jié)構(gòu)來進(jìn)行。DCB結(jié)構(gòu)包含了諸如波特率、數(shù)據(jù)位數(shù)、奇偶校驗(yàn)和停止位數(shù)等信息。在查詢或配置串口的屬性時(shí),都要用DCB結(jié)構(gòu)來作為緩沖區(qū)。一般用CreateFile打開串口后,可以調(diào)用GetCommState函數(shù)來獲取串口的初始配置.要修改串口的配置,應(yīng)該先修改DCB結(jié)構(gòu),然后再調(diào)用SetCommState函數(shù)設(shè)置串口。DCB結(jié)構(gòu)包含了串口的各項(xiàng)參數(shù)設(shè)置,下面僅介紹幾個(gè)該結(jié)構(gòu)常用的變量。

      除了在BCD中的設(shè)置外,程序一般還需要設(shè)置I/O緩沖區(qū)的大小和超時(shí).Windows用I/O緩沖區(qū)來暫存串口輸入和輸出的數(shù)據(jù)。如果通信的速率較高,則應(yīng)該設(shè)置較大的緩沖區(qū)。調(diào)用SetupComm函數(shù)可以設(shè)置串行口的輸入和輸出緩沖區(qū)的大小。

      在用ReadFile和WriteFile讀寫串行口時(shí),需要考慮超時(shí)問題.超時(shí)的作用是在指定的時(shí)間內(nèi)沒有讀入或發(fā)送指定數(shù)量的字符,ReadFile或WriteFile的操作仍然會結(jié)束。要查詢當(dāng)前的超時(shí)設(shè)置應(yīng)調(diào)用GetCommTimeouts函數(shù),該函數(shù)會填充一個(gè)COMMTIMEOUTS結(jié)構(gòu),調(diào)用SetCommTimeouts可以用某一個(gè)COMMTIMEOUTS結(jié)構(gòu)的內(nèi)容來設(shè)置超時(shí)。讀寫串口的超時(shí)有兩種:間隔超時(shí)和總超時(shí)。間隔超時(shí)是指在接收時(shí)兩個(gè)字符之間的最大時(shí)延,總超時(shí)是指讀寫操作總共花費(fèi)的最大時(shí)間,寫操作只支持總超時(shí),而讀操作兩種超時(shí)均支持。用COMMTIMEOUTS結(jié)構(gòu)可以規(guī)定讀寫操作的超時(shí),COMMTIMEOUTS結(jié)構(gòu)的定義為:

      COMMTIMEOUTS結(jié)構(gòu)的成員都以毫秒為單位,總超時(shí)的計(jì)算公式是:

      總超時(shí)=時(shí)間系數(shù)×要求讀/寫的字符數(shù)+時(shí)間常量

      例如要讀入10個(gè)字符,那么讀操作的總超時(shí)的計(jì)算公式為:

      讀總超時(shí)=ReadTotalTimeoutMultiplier×10+ReadTotalTimeoutConstant

      可以看出:間隔超時(shí)和總超時(shí)的設(shè)置是不相關(guān)的,這可以方便通信程序靈活地設(shè)置各種超時(shí)。如果所有寫超時(shí)參數(shù)均為0,那么就不使用寫超時(shí)。如果ReadIntervalTimeout為0,那么就不使用讀間隔超時(shí)。如果 ReadTotalTimeoutMultiplier和 ReadTotalTimeoutConstant都為 0,則不使用讀總超時(shí)。如果讀間隔超時(shí)被設(shè)置成MAXDWORD并且讀時(shí)間系數(shù)和讀時(shí)間常量都為0,那么在讀一次輸入緩沖區(qū)的內(nèi)容后讀操作就立即返回,而不管是否讀入了要求的字符。在用重疊方式讀寫串口時(shí),雖然ReadFile和WriteFile在完成操作以前就可能返回,但超時(shí)仍然是起作用的。在這種情況下,超時(shí)規(guī)定的是操作的完成時(shí)間,而不是ReadFile和WriteFile的返回時(shí)間。

      配置串口的示例:

      3 讀寫串口

      使用ReadFile和WriteFile讀寫串口,下面是兩個(gè)函數(shù)的聲明:BOOL ReadFile(HANDLE hFile,//串口的句柄

      在用ReadFile和WriteFile讀寫串口時(shí),既可以同步執(zhí)行,也可以重疊執(zhí)行。在同步執(zhí)行時(shí),函數(shù)直到操作完成后才返回。這意味著同步執(zhí)行時(shí)線程會被阻塞,從而導(dǎo)致效率下降。在重疊執(zhí)行時(shí),即使操作還未完成,這兩個(gè)函數(shù)也會立即返回,費(fèi)時(shí)的I/O操作在后臺進(jìn)行。ReadFile和WriteFile函數(shù)是同步還是異步由CreateFile函數(shù)決定,如果在調(diào)用CreateFile創(chuàng)建句柄時(shí)指定FILE_FLAG_OVERLAPPED標(biāo)志,那么調(diào)用ReadFile和WriteFile對該句柄進(jìn)行的操作就應(yīng)該是重疊的;如果未指定重疊標(biāo)志,則讀寫操作應(yīng)該是同步的。ReadFile和WriteFile函數(shù)的同步或者異步應(yīng)該和CreateFile函數(shù)相一致。ReadFile函數(shù)只要在串口輸入緩沖區(qū)中讀入指定數(shù)量的字符,就算完成操作。而WriteFile函數(shù)不但要把指定數(shù)量的字符拷入到輸出緩沖區(qū),而且要等這些字符從串行口送出去后才算完成操作。如果操作成功,這兩個(gè)函數(shù)都返回TRUE。需要注意的是,當(dāng)ReadFile和WriteFile返回FALSE時(shí),不一定就是操作失敗,線程應(yīng)該調(diào)用GetLastError函數(shù)分析返回的結(jié)果。例如,在重疊操作時(shí)如果操作還未完成函數(shù)就返回,那么函數(shù)就返回FALSE,而且GetLastError函數(shù)返回ERROR_IO_PENDING,這說明重疊操作還未完成。而較多使用異步重疊操作方式。有兩種方法可以等待操作完成:一種方法是用象WaitForSingleObject這樣的等待函數(shù)來等待OVERLAPPED結(jié)構(gòu)的hEvent成員;另一種方法是調(diào)用GetOverlappedResult函數(shù)等待,后面將演示說明。下面先簡單介紹一下OVERLAPPED結(jié)構(gòu)和GetOverlappedResult函數(shù):OVERLAPPED結(jié)構(gòu)OVERLAPPED結(jié)構(gòu)包含了重疊I/O的一些信息,定義如下:

      在使用ReadFile和WriteFile重疊操作時(shí),線程需要創(chuàng)建OVERLAPPED結(jié)構(gòu)以供這兩個(gè)函數(shù)使用。線程通過OVERLAPPED結(jié)構(gòu)獲得當(dāng)前的操作狀態(tài),該結(jié)構(gòu)最重要的成員是hEvent.hEvent是讀寫事件。當(dāng)串口使用異步通訊時(shí),函數(shù)返回時(shí)操作可能還沒有完成,程序可以通過檢查該事件得知是否讀寫完畢。當(dāng)調(diào)用ReadFile,WriteFile函數(shù)的時(shí)候,該成員會自動被置為無信號狀態(tài);當(dāng)重疊操作完成后,該成員變量會自動被置為有信號狀態(tài)。

      該函數(shù)返回重疊操作的結(jié)果,用來判斷異步操作是否完成,它是通過判斷OVERLAPPED結(jié)構(gòu)中的hEvent是否被置位來實(shí)現(xiàn)的。

      異步讀串口的示例:

      該函數(shù)獲得通信錯(cuò)誤并報(bào)告串口的當(dāng)前狀態(tài),同時(shí),該函數(shù)清除串口的錯(cuò)誤標(biāo)志以便繼續(xù)輸入、輸出操作。參數(shù)lpStat指向一個(gè)COMSTAT結(jié)構(gòu),該結(jié)構(gòu)返回串口狀態(tài)信息。COMSTAT結(jié)構(gòu)COMSTAT結(jié)構(gòu)包含串口的信息,結(jié)構(gòu)定義如下:

      這里只用到了cbInQue成員變量,該成員變量的值代表輸入緩沖區(qū)的字節(jié)數(shù)。最后用PurgeComm函數(shù)清空串口的輸入輸出緩沖區(qū)。

      異步寫串口的示例:

      4 關(guān)閉串口

      利用API函數(shù)關(guān)閉串口非常簡單,只需使用CreateFile函數(shù)返回的句柄作為參數(shù)調(diào)用CloseHandle即可:

      5 結(jié)語

      在具體開發(fā)過程中要用到多線程方式,讓接收模塊用一個(gè)守護(hù)線程來把串口實(shí)時(shí)的監(jiān)控起來,當(dāng)有數(shù)據(jù)收到時(shí)候就告知其他應(yīng)用線程,這時(shí)還要用到事件類來維護(hù)應(yīng)用線程和守護(hù)線程之間的同步通信方式。還有一個(gè)問題就是接收過程中時(shí)序不確定性,可能是由于對串口硬件本身通信機(jī)制沒有徹底把握清楚,所以在接收函數(shù)中需要加適當(dāng)?shù)难訒r(shí),這個(gè)延時(shí)的大小就需要建立一個(gè)輔助文件來打印下所接受的數(shù)據(jù),進(jìn)而隨著時(shí)延變化觀察分析所接收的數(shù)據(jù)是否符合預(yù)期后,確定相應(yīng)時(shí)延。這些是應(yīng)用串口通信過程中所得到的體會。

      [1]李現(xiàn)勇.Visual C++串口通信技術(shù)與工程實(shí)踐[M].北京:人民郵電出版社,2009.

      [2]張?bào)蘩?,劉書?Visual C++實(shí)踐與提高:串口應(yīng)用與工程應(yīng)用篇[M].北京:中國鐵道出版社,2011.

      [3]周韌研.Visual C++串口通信開發(fā)入門與編程實(shí)踐[M].北京:電子工業(yè)出版社,2006.

      [4]劉書智.Visual C++串口通信與工程應(yīng)用實(shí)踐[M].北京:中國鐵道出版社,2007.

      [5]譚思亮,鄒超群.Visual C++串口通信工程開發(fā)實(shí)例導(dǎo)航[M].北京:人民郵電出版社,2009.

      猜你喜歡
      句柄緩沖區(qū)線程
      嵌入式系統(tǒng)環(huán)形緩沖區(qū)快速讀寫方法的設(shè)計(jì)與實(shí)現(xiàn)
      高校圖書館持久標(biāo)識符應(yīng)用研究
      編譯程序語法分析句柄問題分析與探討
      淺談linux多線程協(xié)作
      關(guān)鍵鏈技術(shù)緩沖區(qū)的確定方法研究
      MFC應(yīng)用程序多線程混合顯示界面方法研究
      基于SPY++的軟件功能擴(kuò)展的研究
      Linux線程實(shí)現(xiàn)技術(shù)研究
      地理信息系統(tǒng)繪圖緩沖區(qū)技術(shù)設(shè)計(jì)與實(shí)現(xiàn)
      電視技術(shù)(2012年1期)2012-06-06 08:13:58
      锦州市| 化德县| 涡阳县| 尖扎县| 高雄市| 武威市| 繁昌县| 临漳县| 泾源县| 蒙自县| 祁门县| 翁源县| 保康县| 祁门县| 库车县| 内丘县| 泰来县| 珠海市| 山西省| 沈丘县| 河津市| 榕江县| 沂源县| 泗阳县| 定襄县| 七台河市| 陇西县| 阿图什市| 浦城县| 梧州市| 海安县| 玉田县| 蓬安县| 高安市| 酒泉市| 宜春市| 宿州市| 万载县| 宣汉县| 镇安县| 定兴县|