• 
    

    
    

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

      基于多線程技術(shù)的串口通信的設(shè)計(jì)與研究

      2010-09-13 02:20:56李可一朱環(huán)娟周鳳華
      科技傳播 2010年15期
      關(guān)鍵詞:全雙工承德緩沖區(qū)

      李可一,朱環(huán)娟,周鳳華

      1.北京林業(yè)大學(xué)工學(xué)院自動化系,北京 100083

      2.河北省承德市氣象局,河北承德 067000

      3.華北電網(wǎng)有限公司承德供電公司,河北承德 067000

      基于多線程技術(shù)的串口通信的設(shè)計(jì)與研究

      李可一1,朱環(huán)娟2,周鳳華3

      1.北京林業(yè)大學(xué)工學(xué)院自動化系,北京 100083

      2.河北省承德市氣象局,河北承德 067000

      3.華北電網(wǎng)有限公司承德供電公司,河北承德 067000

      本文以VC++ 6.0為開發(fā)平臺,講述了如何使用32位的WindoWs API 串口通信函數(shù),編程實(shí)現(xiàn)高效的多線程全雙工串口通信,并在闡述中給出了相關(guān)函數(shù)或代碼。實(shí)驗(yàn)證明,該方法有著較好的靈活性、可靠性與高效性。

      VC++;串口通信;多線程;重疊I/O

      0 引言

      串口是常用的計(jì)算機(jī)與外部設(shè)備之間的數(shù)據(jù)傳輸通道,由于使用其通信方便易行,且能實(shí)現(xiàn)數(shù)據(jù)的長遠(yuǎn)距離傳輸,故應(yīng)用極其廣泛。為此,根據(jù)不同的使用環(huán)境靈活地編寫出串口通信處理程序是必要的工作。在Windows上,微軟專門提供了相應(yīng)的文件I/O函數(shù)和通信函數(shù),以方便我們編寫出所需的串口通信程序。目前,實(shí)現(xiàn)串口通信的方法有兩種。第一種,使用VC++提供的串口通信控件MSComm;第二種,使用32位的API 通信函數(shù)。本文采用了第二種方法,且結(jié)合多線程技術(shù),實(shí)現(xiàn)了更加靈活的串口通信程序設(shè)計(jì)。

      1 編程實(shí)現(xiàn)過程

      1.1 初始化端口

      在Windows操作系統(tǒng)中,串行口是被作為文件來進(jìn)行處理的,而不是直接對端口進(jìn)行操作,為此我們使用某一個串口進(jìn)行通信時,需首先調(diào)用API函數(shù) CreateFile(szPort,GENERIC_ READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL );獲取一個串口通信設(shè)備句柄hCom。其中,該函數(shù)的第一個參數(shù)szPort標(biāo)識將要開啟的端口號,第二個參數(shù)規(guī)定了端口讀寫屬性,剩下的參數(shù)中較重要的是設(shè)置FILE_FLAG_OVERLAPPED標(biāo)識,即開啟重疊I/O的方式。在該模式下,當(dāng)我們調(diào)用讀寫函數(shù)時,即使操作還未完成,被調(diào)用的函數(shù)也會立即返回,這樣費(fèi)時的I/O操作會在后臺進(jìn)行,使系統(tǒng)在這段時間可以去干別的事情,提高了系統(tǒng)的執(zhí)行效率,且借用多線程技術(shù)還能實(shí)現(xiàn)讀、寫的同時進(jìn)行。

      接下來,需要根據(jù)需求,調(diào)用SetCommTimeouts(hCom, &m_ CommTimeouts);函數(shù),設(shè)置COMMTIMEOUTS類型的結(jié)構(gòu)體變量m_CommTimeouts。更改COMMTIMEOUTS結(jié)構(gòu)體里面的成員變量,可以設(shè)置串口讀寫超時時間,以實(shí)現(xiàn)系統(tǒng)若未在指定時間內(nèi)讀出或?qū)懭胫付〝?shù)量的字符,就不再繼續(xù),立即返回執(zhí)行下一次的任務(wù)。然后,還需要分別調(diào)用SetCommState和SetupComm函數(shù),設(shè)置端口的速率、數(shù)據(jù)位、輸入輸出緩沖區(qū)大小等配置信息。至此,就完成了串口的初始化并開啟操作。

      1.2 串口讀寫的實(shí)現(xiàn)

      1.2.1 多線程全雙工通信

      想要編寫高效率的串口通信程序,除了設(shè)置重疊I/O外,再結(jié)合多線程技術(shù),可以起到更好的效果。所謂多線程,就是指要計(jì)算機(jī)并行的處理不同的事情。在VC中線程分為用戶界面線程和工作者線程,其主要區(qū)別是前者能夠提供界面和用戶的交互,而后者沒有界面,用于處理后臺任務(wù)。本文在設(shè)計(jì)通信程序時,建立了兩個工作者線程,一個用于不斷監(jiān)視數(shù)據(jù)的接收,一個用于數(shù)據(jù)的發(fā)送。這樣,使程序?qū)崿F(xiàn)了收發(fā)同時進(jìn)行的全雙工工作方式,在實(shí)際應(yīng)用中更有效率。

      另外,值得注意的是使用重疊I/O需要創(chuàng)建OVERLAPPED結(jié)構(gòu)以供讀寫函數(shù),即ReadFile和WriteFile使用。而OVERLAPPED結(jié)構(gòu)中最重要的成員是hEvent。hEvent是一個事件對象句柄,通過CreateEvent函數(shù)來創(chuàng)建,被用作線程的同步對象使用。如果讀寫函數(shù)未完成操作就返回,那么會將hEvent置為無信號狀態(tài)。只有操作完成后(包括超時),hEvent才會置為有信號狀態(tài),這樣我們就可以通過hEvent知曉當(dāng)前通訊設(shè)備的讀寫狀態(tài)。

      實(shí)際程序運(yùn)行時,若發(fā)現(xiàn)讀、寫函數(shù)的返回值為假,由于開啟了重疊I/O方式,那么未必是指讀寫失敗,此時需要通過GetLastError函數(shù)的返回值做進(jìn)一步判斷。若返回為ERROR_IO_ PENDING,說明當(dāng)前讀或?qū)懖僮鬟€未完成,這時就可以掛起讀、寫線程,等待操作完成。而程序設(shè)計(jì)時有兩種等待方法:一種是用WaitForSingleObject等待函數(shù)來等待OVERLAPPED結(jié)構(gòu)體中的成員hEvent為有信號狀態(tài);另一種辦法是調(diào)用GetOverlappedResult函數(shù)等待,注意需要將該函數(shù)的bWait參數(shù)設(shè)為TRUE,那么該函數(shù)將會一直等待hEvent 事件,直到其有信號才返回。同時,利用GetOverlappedResult還可以返回一個OVERLAPPED結(jié)構(gòu)體,里面包含有實(shí)際發(fā)送、接收字節(jié)等重疊操作的結(jié)果。

      下面將分別給出讀、寫線程的關(guān)鍵代碼,并作適當(dāng)分析。

      1.2.2 串口讀操作

      以上給出的即是接收數(shù)據(jù)線程的主要代碼,由于在實(shí)際使用中,我們想實(shí)時監(jiān)控端口的數(shù)據(jù)輸入情況,做到輸入緩沖區(qū)一有數(shù)據(jù)傳來就立即執(zhí)行讀取操作,故在程序中要建立一個定時器,設(shè)定一個監(jiān)控的時間間隔,定點(diǎn)不斷執(zhí)行以上工作者線程的代碼,以實(shí)現(xiàn)對端口的監(jiān)控。另外,我們在線程中需要使用ClearCommError函數(shù)獲取輸入緩沖區(qū)的數(shù)據(jù)狀態(tài),以判斷是否該開始讀取數(shù)據(jù)。

      1.2.3 串口寫操作

      以上所示的數(shù)據(jù)發(fā)送線程,我們只需在想要發(fā)送數(shù)據(jù)時創(chuàng)建、啟動線程即可。

      2 結(jié)論

      本文描述了在VC++上如何使用Win32 API中相關(guān)的通信函數(shù),編程實(shí)現(xiàn)串口通訊程序,且采用多線程的程序設(shè)計(jì)思想,在重疊I/O的方式下,不僅提高了串口通信的效率,而且還實(shí)現(xiàn)了收發(fā)同時進(jìn)行的全雙工工作方式,為計(jì)算機(jī)與外部設(shè)備通過串口通信提供了更靈活的方案。

      [1]胡春燕.基于VC的串口通信的實(shí)現(xiàn)[J].福建電腦,2005(10).

      [2]闞能琪. VC ++ 串口通信中多線程技術(shù)的應(yīng)用研究[J].西華大學(xué)學(xué)報(bào):自然科學(xué)版,2005,7.

      [3]孫鑫,余安萍. VC++深入詳解[M].北京:電子工業(yè)出版社,2006,6.

      [4]Microsoft Corporation. Microsoft Developer NetWork Library[DB/DK].Microsoft Corporation,2001.

      TP313

      A

      1674-6708(2010)24-0219-02

      猜你喜歡
      全雙工承德緩沖區(qū)
      對抗全雙工主動竊聽的安全高效D2D通信策略
      無線電工程(2024年5期)2024-07-20 00:00:00
      嵌入式系統(tǒng)環(huán)形緩沖區(qū)快速讀寫方法的設(shè)計(jì)與實(shí)現(xiàn)
      中國農(nóng)業(yè)發(fā)展銀行承德分行
      中國農(nóng)業(yè)發(fā)展銀行承德分行
      RLS算法在同時同頻全雙工系統(tǒng)中的自干擾抑制性能分析
      同頻同時全雙工數(shù)字自干擾抵消算法
      5G全雙工技術(shù)淺析
      移動通信(2015年15期)2015-12-26 08:52:40
      關(guān)鍵鏈技術(shù)緩沖區(qū)的確定方法研究
      中國農(nóng)業(yè)發(fā)展銀行承德分行
      地理信息系統(tǒng)繪圖緩沖區(qū)技術(shù)設(shè)計(jì)與實(shí)現(xiàn)
      西和县| 霍城县| 台东市| 井冈山市| 文昌市| 延川县| 吉木乃县| 绥滨县| 汝阳县| 佛冈县| 西畴县| 柏乡县| 定兴县| 柳河县| 铁岭市| 太仓市| 黑龙江省| 苍南县| 射阳县| 溧水县| 金湖县| 朝阳县| 河津市| 大同市| 印江| 师宗县| 津市市| 湖南省| 莱阳市| 太仆寺旗| 晋州市| 剑川县| 无棣县| 偏关县| 旬邑县| 威海市| 防城港市| 盐城市| 阳信县| 广安市| 乌审旗|