新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Windows CE.NET 4.2下PC與單片機的串行通信

        Windows CE.NET 4.2下PC與單片機的串行通信

        作者: 時間:2012-03-07 來源:網絡 收藏

        2.5異步多線程

        雖然 CE不支持重疊I/O,但還是可以使用多個線程來實現同樣的操作。當主線程正忙時,需要做的就是運行單獨的線程來處理同步I/O操作。除了使用用于讀和寫的單獨線程以外, CE還支持Win32的WaitCommEvent函數,該函數將線程阻塞,直到預先設定的事件中的一個發生。該函數一般和函數 SetCommMask配合起來使用,SetCommMask設置WaitCommEvent要等待的串口事件。一般的使用方法是:

        先調用SetCommMask函數設定要等待的串口事件,例如串口有數據到來(EV_RXCHAR)事件;然后在讀串口線程中調用WaitCommEvent阻塞線程,等待EV_RXCHAR事件的發生。當等

        待的EV_RXCHAR事件發生時,調用ClearCommError函數清除錯誤信息,并且獲取串口的當前狀態,主要是獲取串口接收緩沖區中的字節數,然后調用ReadFile函數將接收緩沖區的數據全部讀出。最后調用PostMessage函數將這些數據發送給主線程進行處理。

        這里存在一個問題:讀串口數據操作是在讀串口線程中進行的,而處理數據操作是在主線程中進行的,如果上次接收的數據還沒處理完,下次的數據又發送給了主線程處理,勢必造成混亂。這個問題的解決,涉及到線程間的同步機制。

        2.6線程間的同步

        CE中采用同步對象的方法來協調多線程的執行。一個線程監視一個同步對象,當用信號通知該對象時,解除正在阻塞的線程并調度該線程。同步對象包括事件和互斥體兩種方式。本文只介紹事件方式。

        事件對象是一種有兩種信號狀態有信號和無信號的同步對象,創建的事件對象可以被不同的線程共享。Windows CE常用等待函數阻塞線程自身的執行,等待其監視的對象產生一定的信號才停止阻塞,繼續線程的執行。常用的等待函數有監視單個同步對象的 WaitForSingleObject,和監視多個同步對象的WaitForMultipleObjects。在Windows CE串口通信中,用CreateEvent函數創建事件時,手動設置為有信號狀態,以便程序在第一次能夠順利地進入到WaitCommEvent函數處等待串口數據的到來,等到程序讀取了串口的數據并發送給主線程處理后,調用ResetEvent函數將事件狀態設置成無信號狀態,線程就阻塞在 WaitForSingleObject函數處,一直等到主線程把接收到的數據處理完后,再將事件狀態用SetEvent函數設置成有信號狀態,釋放 WaitForSingleObject函數對線程的阻塞,重新進入WaitCommEvent函數處等待串口數據的到來。循環接收、處理串口數據的流程如圖1所示。

        40.jpg

        通信相關文章:通信原理




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 沂源县| 贵阳市| 垫江县| 克什克腾旗| 叶城县| 铜鼓县| 花莲市| 卓资县| 霍林郭勒市| 灵川县| 南阳市| 广宁县| 长垣县| 贵定县| 离岛区| 承德县| 叶城县| 吴堡县| 南城县| 临猗县| 兴仁县| 青神县| 朝阳市| 龙里县| 依安县| 盐源县| 砀山县| 噶尔县| 岱山县| 平南县| 西和县| 怀宁县| 夏邑县| 丹凤县| 磐石市| 通化县| 阿鲁科尔沁旗| 淮安市| 上饶县| 通许县| 安福县|