Windows CE.NET 4.2下PC與單片機(jī)的串行通信
2.5異步多線程通信
雖然Windows CE不支持重疊I/O,但還是可以使用多個(gè)線程來(lái)實(shí)現(xiàn)同樣的操作。當(dāng)主線程正忙時(shí),需要做的就是運(yùn)行單獨(dú)的線程來(lái)處理同步I/O操作。除了使用用于讀和寫的單獨(dú)線程以外,Windows CE還支持Win32的WaitCommEvent函數(shù),該函數(shù)將線程阻塞,直到預(yù)先設(shè)定的串行通信事件中的一個(gè)發(fā)生。該函數(shù)一般和函數(shù) SetCommMask配合起來(lái)使用,SetCommMask設(shè)置WaitCommEvent要等待的串口事件。一般的使用方法是:
先調(diào)用SetCommMask函數(shù)設(shè)定要等待的串口事件,例如串口有數(shù)據(jù)到來(lái)(EV_RXCHAR)事件;然后在讀串口線程中調(diào)用WaitCommEvent阻塞線程,等待EV_RXCHAR事件的發(fā)生。當(dāng)?shù)?p>待的EV_RXCHAR事件發(fā)生時(shí),調(diào)用ClearCommError函數(shù)清除通信錯(cuò)誤信息,并且獲取串口的當(dāng)前狀態(tài),主要是獲取串口接收緩沖區(qū)中的字節(jié)數(shù),然后調(diào)用ReadFile函數(shù)將接收緩沖區(qū)的數(shù)據(jù)全部讀出。最后調(diào)用PostMessage函數(shù)將這些數(shù)據(jù)發(fā)送給主線程進(jìn)行處理。
這里存在一個(gè)問(wèn)題:讀串口數(shù)據(jù)操作是在讀串口線程中進(jìn)行的,而處理數(shù)據(jù)操作是在主線程中進(jìn)行的,如果上次接收的數(shù)據(jù)還沒(méi)處理完,下次的數(shù)據(jù)又發(fā)送給了主線程處理,勢(shì)必造成混亂。這個(gè)問(wèn)題的解決,涉及到線程間的同步機(jī)制。
2.6線程間的同步
在Windows CE中采用同步對(duì)象的方法來(lái)協(xié)調(diào)多線程的執(zhí)行。一個(gè)線程監(jiān)視一個(gè)同步對(duì)象,當(dāng)用信號(hào)通知該對(duì)象時(shí),解除正在阻塞的線程并調(diào)度該線程。同步對(duì)象包括事件和互斥體兩種方式。本文只介紹事件方式。
事件對(duì)象是一種有兩種信號(hào)狀態(tài)有信號(hào)和無(wú)信號(hào)的同步對(duì)象,創(chuàng)建的事件對(duì)象可以被不同的線程共享。Windows CE常用等待函數(shù)阻塞線程自身的執(zhí)行,等待其監(jiān)視的對(duì)象產(chǎn)生一定的信號(hào)才停止阻塞,繼續(xù)線程的執(zhí)行。常用的等待函數(shù)有監(jiān)視單個(gè)同步對(duì)象的 WaitForSingleObject,和監(jiān)視多個(gè)同步對(duì)象的WaitForMultipleObjects。在Windows CE串口通信中,用CreateEvent函數(shù)創(chuàng)建事件時(shí),手動(dòng)設(shè)置為有信號(hào)狀態(tài),以便程序在第一次能夠順利地進(jìn)入到WaitCommEvent函數(shù)處等待串口數(shù)據(jù)的到來(lái),等到程序讀取了串口的數(shù)據(jù)并發(fā)送給主線程處理后,調(diào)用ResetEvent函數(shù)將事件狀態(tài)設(shè)置成無(wú)信號(hào)狀態(tài),線程就阻塞在 WaitForSingleObject函數(shù)處,一直等到主線程把接收到的數(shù)據(jù)處理完后,再將事件狀態(tài)用SetEvent函數(shù)設(shè)置成有信號(hào)狀態(tài),釋放 WaitForSingleObject函數(shù)對(duì)線程的阻塞,重新進(jìn)入WaitCommEvent函數(shù)處等待串口數(shù)據(jù)的到來(lái)。循環(huán)接收、處理串口數(shù)據(jù)的流程如圖1所示。
通信相關(guān)文章:通信原理
評(píng)論