• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 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
    泗水县| 镇巴县| 郎溪县| 宁晋县| 娱乐| 郑州市| 随州市| 谢通门县| 阳信县| 华池县| 玛曲县| 农安县| 兴宁市| 杨浦区| 兴安县| 沙河市| 瑞金市| 南部县| 西安市| 晋中市| 卫辉市| 安多县| 棋牌| 鄂尔多斯市| 常德市| 宜良县| 甘德县| 手游| 富阳市| 安福县| 长沙县| 湘阴县| 遵义县| 县级市| 清镇市| 甘谷县| 临洮县| 星座| 伊吾县| 金川县| 定结县|