1.PC和Windows CE的通信系統
Win32的通信系統 Win32提供給用戶一個模塊化的32位的保護模式的通信系統。在Win32中,各種通信資源的函數做了很大的改進和標準化,使得它們的操作就如同文件的操作一樣。
在串口讀寫操作中,Win32引入了超時概念。超時直接影響讀和寫的操作行為。當超過預先設定的超時間隔時,ReadFile、WriteFile操作仍未結束,那么將無條件結束讀寫操作,而不論是否已讀出或寫入指定數量的字符。
Windows CE的通信系統 Windows CE將驅動程序分為兩種:本地設備驅動程序和流設備驅動程序。本地設備驅動程序,也稱為“內置驅動程序”,這些設備驅動程序是一些硬件所必需的,是由原始設備制造商創建的,用以驅動如鍵盤、觸摸屏、音頻設備等,往往在設備售出后就不會再更換。另一方面,流接口設備驅動程序(指可安裝的啟動程序)可以由第三方生產商提供,以支持添加到系統中的設備。Windows CE下的設備驅動程序在與應用程序相同的保護級上工作。當系統啟動時,大多數驅動程序是由設備管理進程(DEVICE.EXE)加載的,所有的這些驅動程序將共享同一個進程地址空間。
本地設備驅動程序一般都被緊緊地限制在Windows CE的操作系統中,往往在設備售出后就不會再更換。因為Windows CE沒有像ISA或PCI那樣的用于附加插卡的總線,附加的硬件通常是通過PCMCIA或“小型快閃槽”安裝的,例如串口2是通過PCMCIA卡實現的。觀察注冊表中的HKEY_LOCAL_MACHINE下的\Drivers\Active鍵中的內容,可以了解在Windows CE中加載了什么驅動程序。
通信過程
包括(1)打開通信資源。在進程使用串口之前,首先應使用CreateFile函數打開通信資源,返回一個標識該資源的句柄。在CreateFile函數打開串口通信資源時,系統將根據上次打開資源時的數值初始化和配置資源;(2)讀寫串口資源。通過ReadFile和WriteFile函數來讀寫串口。讀和寫的超時時間由SetCommTimeouts函數設置;(3)關閉通信資源。在使用通信資源結束后,應調用CloseHandle函數來關閉通信句柄,釋放資源。
2.控件的設計與實現
控件的設計
一般的掌上電腦只配備了串口1,而串口2則需要外接適配卡。本文主要是針對長白公司生產的藍天LT-90-1機型提供輔助的功能,所以本控件默認使用串口1。由于掌上電腦的資源比較少,為了盡量減少CPU的占用,本控件采用了每一定時間間隔對串口進行采樣的方案,對串口的每一次讀寫采取了限時的方法,保證控件可以在較短的時間結束調用,用犧牲一定的成功率來實現調用的效率,避免無限時的對串口操作的等待而引起的待機。控件的設計包括:
控件目的:提供對串口通信的打開、關閉和讀寫的控制。
控件設計的主要部分是與使用者之間交互的過程,即控件提供給使用者的函數和通過事件來通知使用者做出相應的處理。下面是本控件所實現的事件和方法。
控件觸發的事件:在串口通信的過程中,控件通過如下的兩個事件來通知使用者做出處理。
NewData:當此事件被觸發時,表示在串口收到新的數據,此時程序應對該事件做出反應,及時收取數據。
WriteError:當此事件被觸發時,表示對串口的寫操作失敗了,此時程序應對錯誤進行處理。
控件實現的方法:控件提供了四個方法供使用者調用,使用者在得到控件指針后,通過這四個函數來完成對串口的打開、關閉和讀寫。Open:無參數。在次使用時,應調用此函數,對串口進行初始化。默認串口的參數為9600波特率、8位字符、一位校正位、奇偶校驗。當初始化成功時返回TRUE,失敗時返回FALSE。Read:參數ReadBuffer和ReadSize,ReadBuffer是一個讀入字符緩沖區。在NewData事件的響應函數內部,使用Read來讀取從串口輸入的字符。成功時函數返回TRUE,ReadSize返回讀出的字節個數,ReadBuffer返回讀出的字符;失敗時,函數返回FALSE。Write:參數WtiteBuffer和WriteSize,WriteBuffer是想要寫入串口的字符。此函數可在任何時候調用。如果函數返回FALSE,則表示輸入的參數有錯誤;如果函數返回TRUE,則表示輸入參數正確。如果在傳輸的過程中出現了錯誤,則控件將引發WriteError事件,通知應用程序寫操作失敗,并由應用程序做出相應的處理。Close:無參數。在串口使用結束后,請調用此函數,它將釋放由控件打開的串口資源,以便其他的程序繼續使用該資源。
基本的串行通信編程
串行設備被視為用于打開、關閉、讀和寫串口的常規、可安裝的流設備。Win32 API提供了一組通信函數,Windows CE支持了其中的大多數通信函數。
打開和關閉串行端口:在所有的流設備都可以使用CreateFile來打開串行端口設備。一般的調用方法如下:
hSer=CreateFile(TEXT(“COM1:”),
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
由于Windows CE不支持設備的重疊I/O,因此不能傳遞FILE_FLAG_OVERLAPPED標志。當不成功時,返回句柄INVALILD_HANDLE_value,反之返回打開的串行端口句柄。
調用CloseHandle可以關閉一個串行端口:
CloseHandle(hSer);
讀寫串行端口:可以使用ReadFile和WriteFile來讀寫串行端口。從串口讀出數據只需如下調用:
int rc;
DWORD cBytes;
BYTE ch;
rc=ReadFile(hSer,&ch,1,&cBytes,NULL);
調用成功,則變量ch將讀入一個字節,cBytes將被設置為讀取的字節的數量。
從串口寫入數據只需如下調用:
int rc;
DWORD cBytes;
BYTE ch;
ch=TEXT(‘A’);
rc=WriteFile(hSer , &ch , 1 , &cBytes , NULL );
上面的代碼將字母A寫入已經打開的端口,成功的話,ReadFile和WriteFile都將返回TRUE。
控件的調試
由于本控件的開發平臺的特點,使得程序的調試有所不同。在程序編譯后,Visual C++使用同步服務器將程序傳輸到掌上電腦中,此時,掌上電腦與主機之間使用了串口1,如果不關閉同步服務器的話,那么在掌上電腦使用控件對串口1進行初始化時,將會失敗。因此,必須在程序傳輸到掌上電腦后,將與主機的連接關閉,同時要在主機上關閉同步服務器,否則服務器將不停地向掌上電腦發送同步信號。由于關閉了串口,則無法使用Visual C++提供的調試功能,只有在程序中自己輸出調試信息,并改正程序。基本的調試手段是在程序需要查看變量的地方,用AfxMessageBox函數將變量的內容輸出,或者在程序的對話框中添加一個文本編輯控件,來輸出程序的信息。
控件的臺式機版的實現
在實現了一個Windows CE的控件后,開發者將會面臨一個問題,當你想在你的應用程序中使用該控件的時候,你在臺式機的注冊表中找不到你設計的控件,因而也無法在Visual C++中或Visual Basic中使用。這是因為CE版的Active X控件被注冊在相應的Windows CE的設備的注冊表中,而沒有在臺式機上注冊。
為了解決這個問題,你必須實現兩個版本的CE控件。版本1注冊在你的Windows CE的設備上,版本2注冊在你開發應用程序的臺式機的注冊表中。第二版本的控件實現了在Windows CE上控件的外殼,即提供了控件的所有方法和事件,但沒有具體的函數的實現。它僅用來提供應用程序到控件的所有連接。
3.結束語
本文討論了基于Windows CE平臺的COM應用開發,提出了一個串口通信控件的實現以作為示例。該控件可以嵌入到大部分的Windows CE的程序中,很好地完成現串口通信的基本任務。
目前,COM還處在不斷發展的階段中,新的技術不斷出現。分布式組件對象模型(簡稱為DCOM)把COM的位置透明特性擴展到不同的計算機上。COM+則擴展了中間組件,以便其支持成百上千的同時訪問。COM+組件服務為組件開發者經常需要的服務提供了標準的服務實現,從而解放了開發者,使之能夠把精力集中在商務處理問題上。而微軟的Windows DNA(Windows Distributed Internet Application Architecture),是Windows平臺應用程序基于COM開發的又一模式,它使得客戶機和服務器方的開發更加專一和簡化。這些新的技術,必然會給Windows CE平臺的應用開發帶來更大的活力。相信Windows CE的明天會更加燦爛。
基于Windows CE的COM應用開發
更新時間: 2007-06-28 11:23:45來源: 粵嵌教育瀏覽量:1737