999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于多線程技術的串口通信的設計與研究

2010-09-13 02:20:56李可一朱環娟周鳳華
科技傳播 2010年15期

李可一,朱環娟,周鳳華

1.北京林業大學工學院自動化系,北京 100083

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

3.華北電網有限公司承德供電公司,河北承德 067000

基于多線程技術的串口通信的設計與研究

李可一1,朱環娟2,周鳳華3

1.北京林業大學工學院自動化系,北京 100083

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

3.華北電網有限公司承德供電公司,河北承德 067000

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

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

0 引言

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

1 編程實現過程

1.1 初始化端口

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

接下來,需要根據需求,調用SetCommTimeouts(hCom, &m_ CommTimeouts);函數,設置COMMTIMEOUTS類型的結構體變量m_CommTimeouts。更改COMMTIMEOUTS結構體里面的成員變量,可以設置串口讀寫超時時間,以實現系統若未在指定時間內讀出或寫入指定數量的字符,就不再繼續,立即返回執行下一次的任務。然后,還需要分別調用SetCommState和SetupComm函數,設置端口的速率、數據位、輸入輸出緩沖區大小等配置信息。至此,就完成了串口的初始化并開啟操作。

1.2 串口讀寫的實現

1.2.1 多線程全雙工通信

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

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

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

下面將分別給出讀、寫線程的關鍵代碼,并作適當分析。

1.2.2 串口讀操作

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

1.2.3 串口寫操作

以上所示的數據發送線程,我們只需在想要發送數據時創建、啟動線程即可。

2 結論

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

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

[2]闞能琪. VC ++ 串口通信中多線程技術的應用研究[J].西華大學學報:自然科學版,2005,7.

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

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

TP313

A

1674-6708(2010)24-0219-02

主站蜘蛛池模板: 激情综合婷婷丁香五月尤物| 免费又爽又刺激高潮网址 | 嫩草在线视频| 五月天久久综合| 国产亚洲精品97在线观看| 国产在线视频自拍| 国产麻豆91网在线看| 91综合色区亚洲熟妇p| 国产黄色片在线看| 91综合色区亚洲熟妇p| 精品一区二区三区视频免费观看| 一级毛片免费观看久| 在线欧美日韩| 69国产精品视频免费| 国内自拍久第一页| 一本一本大道香蕉久在线播放| 综合色88| 欧美精品H在线播放| 亚洲色欲色欲www网| 免费无遮挡AV| 制服丝袜一区| 国产网站免费观看| 日日拍夜夜操| 国产网友愉拍精品视频| 欧美一区二区啪啪| 毛片免费视频| 999国产精品| 成人在线亚洲| 伊人久久大香线蕉aⅴ色| 人妻无码中文字幕第一区| 国产精品无码一二三视频| 中文字幕 日韩 欧美| 澳门av无码| 亚洲免费成人网| 欧美一级片在线| 国产一国产一有一级毛片视频| 欧美视频二区| 一本色道久久88综合日韩精品| 2018日日摸夜夜添狠狠躁| 久久毛片网| 日韩毛片视频| 欧美国产日产一区二区| 88国产经典欧美一区二区三区| 97成人在线视频| 视频二区亚洲精品| 亚洲av色吊丝无码| 天堂亚洲网| 国产SUV精品一区二区6| 久久久精品国产亚洲AV日韩| 小说区 亚洲 自拍 另类| 日韩a在线观看免费观看| 欧美精品色视频| 国产成人久视频免费| 国产免费观看av大片的网站| 中文字幕久久亚洲一区| 欧美不卡视频一区发布| 亚洲午夜片| 日韩高清无码免费| 在线观看免费人成视频色快速| 国产色伊人| 国产精品熟女亚洲AV麻豆| 亚洲国产日韩欧美在线| 日韩在线视频网| 伊人91在线| 97色伦色在线综合视频| 综合色在线| 91在线激情在线观看| 超级碰免费视频91| 国产亚洲欧美日韩在线一区| 老司机精品99在线播放| 国产精品妖精视频| 久久久久无码国产精品不卡| 911亚洲精品| 在线毛片网站| 亚洲日本中文字幕天堂网| 小说区 亚洲 自拍 另类| 青青热久麻豆精品视频在线观看| 色婷婷国产精品视频| 成人中文字幕在线| 国产超碰一区二区三区| 国产国产人成免费视频77777| 欧美va亚洲va香蕉在线|