智慧家居系統的設計與實現
論文關鍵詞:智慧家居 嵌入式系統 Windows CE Visual C++ Delphi
論文摘要:本文了基於Windows CE.net 5.0嵌入式作業系統,以使用Intel XScale270為CPU的ARM10嵌入式實驗箱為硬體基礎,以Visual Studio 2005和Delphi為軟體開發平臺的智慧家居系統的設計與。詳細的系統設計過程,開發了的軟體程式,包括嵌入式作業系統Windows CE 5.0的定製、應用程式的介面設計、程式開發和微控制器系統的底層程式設計。本設計融合了嵌入式系統、通訊、微控制器、軟體開發等學科的知識。系統測試結果表明,該系統設計要求,並有的功能擴充套件空間。
1 緒論
,科學技術發展迅速,藉助飛速發展的網路和資訊科技,人們可以足不出戶地縱覽全球。資訊化的需求,科研機構將智慧化的理念引入小區管理,並引入家庭,從而產生了智慧家居的概念。將手機通訊和乙太網通訊技術引入智慧家居的設計,恰好了現的通訊條件,使在外的業主能家中的安全,業主的安全感,而且手機實時控制家電,了業主生活的舒適度。
本文了基於嵌入式系統ARM10的智慧控制平臺的設計,功能包括了簡訊控制家電,感測器探測非環境並且手機簡訊告知業主,乙太網實時視訊監控等功能。
2 系統設計方案
2.1 硬體總體設計框圖
上文的功能需要,設計出由ARM10為控制核心,微控制器控制的家電控制模組和感測器報警模組,並且包含GSM通訊模組的智慧家居系統,硬體結構框圖如圖2-1所示。
SHAPE \* MERGEFORMAT
圖2-1 硬體設計框圖
2.2 控制核心選擇
智慧家居控制系統採用如圖2-2所示的XSBase270開發平臺,該平臺基於Intel®高效能的PXA270器,支援Windows CE和Linux等嵌入式作業系統,是教學和實驗的多功能實驗平臺。
PXA270器的最高主頻可達520MHz,且該器被加入了Wireless MXX技術,大大的了多媒體能力,而且加入了Intel SpeedStep電源管理技術,在CPU效能的前提下,最大限度的降低裝置功耗[1]。
XSBase270配置32M FLASH ROM,64M SDRAM,並配備了觸控式螢幕、乙太網、USB、串列埠、CF/MMC、PCMCIA等介面。
圖2-2 XSBase270實驗箱展開圖
2.3家電控制板
家電控制板採用AT89C51為控制核心。擴充套件板的元件佈局如圖2-3所示,其上有四盞LED分別模擬四種家電,三個按鈕模擬三種感測器。四盞LED分別連線微控制器的P1.0、P1.1、P1.2、P1.3;三個按鈕分別連線P2.0、P2.1、P2.2。
圖2-3 家電控制模組
2.3.1 串列埠電路
家電控制板採用串列埠與XSBase270實驗箱通訊,其採用了經典的相容RS-232標準的MAX232晶片串列埠的電平轉換晶片。電路的連線如圖2-4所示:
圖2-4 家電控制板序列介面電路
如上圖所示,家電擴充套件板採用的是常用的DB9頭串列埠介面,其針腳定義圖如圖2-5所示:
圖2-5 RS-232 DB9頭針腳定義圖
2腳RxD為接收引腳,3腳TxD為傳送引腳,GND為訊號地引腳。情況下普通串列埠只接這幾個引腳;特殊的串列埠,如藍芽串列埠除接上述的三個腳之外,還接了DSR引腳和CTS引腳,是藍芽串列埠的資料流輸出採用這兩個腳的訊號控制;而引腳是跟MODEM的。在智慧家居系統中,家電控制板接普通串列埠,GSM模組接藍芽串列埠。
RS-232訊號相訊號地而言,在正負電平之間擺動。傳送資料時,傳送端輸出的正電平在+5V到+15V之間,負電平在-5V和-15V之間。無資料傳輸時,線上為TTL電平。接收器典型的工作電平在+3V~+12V與-3V~-12V。傳送電平和接收電平的差僅為2~3V左右,其共模抑制能力差,加上雙絞線的分佈電容,訊號傳輸距離最大為15m,最高速率為20kb/s[2]。
MAX232包含2個驅動器、2個接收器和電壓器電路,TIA/EIA-232-F電平。該器件符合TIA/EIA-232-F標準,每接收器將TIA/EIA-232-F電平轉換成5V TTL/CMOS電平。每傳送器將TTL/CMOS電平轉換成TIA/EIA-232-F電平。
圖2-6 MAX232引腳圖
2.3.2 家電控制電路
圖2-7 模擬家電控制電路
家用電器控制的介面電路如圖2-7 所示,K1~K4 為繼電器,分別控制四路家電的閉合和斷開,Q1~Q4 為繼電器線圈電流驅動,電路由微控制器的P1口控制,DD1~DD4 發光二極體用於顯示某路控制電路的工作情況,主要除錯電路而設定。
2.3.3 感測器介面電路
圖2-8 感測器介面電路圖
煙霧、煤氣洩漏、紅外等感測器的報警訊號光電耦合接入微控制器的P2 口,如圖2-8 所示,在感測器報警訊號時,光電耦合晶片截止狀態,與之相接的微控制器埠為低電平;當感測器有報警,感測器輸出高電平,此時光電耦合晶片導通,與之相接的微控制器埠為高電平,由微控制器對報警訊號採集並。
2.4 GSM通訊模組
GSM通訊採用如圖
2-9所示的西門子MC35 GSM/GPRS無線模組通訊工具。它支援EGSM900和GSM1800雙頻,支援數字、語音、短訊息和傳真,使用AT指令控制傳送短訊息。它採用9V直流電源供電,RS-232串列埠與XSBase270試驗箱連線通訊。圖2-9 西門子MC35
2.5 視訊監控模組
視訊採集模組採用使用中星微(Vimicro)公司的ZC0301P晶片的攝像頭, ZC0301P晶片可支援USB 1.1介面,硬體最高支援VGA解析度(640×480)。在VGA模式下可15幀/秒速率,在CIF(352×288)和 SIF(320×240)模式下可30幀/秒速率。它USB介面連線到XSBase270試驗箱。
圖2-10 301P攝像頭
2.6總體軟體設計方案
智慧家居的硬體設計方案,設計出軟體的總體設計方案如圖2-11所示:
圖2-11 軟體設計框圖
:、
(1)家電控制系統和GSM網路通訊各自獨佔RS-232串列埠。家電控制系統接XSBase270的紅外串列埠,GSM模組接藍芽串列埠。如圖2-12所示。
(2)實時視訊監控USB攝像頭捕捉影象,影象資料乙太網傳送到PC客戶端影象還原。
(3)乙太網通訊基於TCP/IP協議,測試環境為區域網,若投入到因特網的應用,則需要在服務端、客戶端所在的區域網連線到因特網的閘道器——即路由器上,要埠對映,才可以網路的連線。
圖2-12 紅外串列埠與藍芽串列埠
智慧家居系統的軟體基於Windows CE 5.0嵌入式作業系統。Windows CE被設計成分層結構,從下而上一共分硬體層、OEM層、作業系統層和應用層共四個層[3]。層次的結構將硬體和軟體,作業系統和應用軟體隔離開,以便於系統的移植。智慧家居的軟體設計主要是在應用層。
3 作業系統的定製
Windows CE 5.0嵌入式作業系統的定製Platform Builder5.0。Platform Builder是微軟公司設計的用於嵌入式操作平臺定製與驅動程式的開發的工具。推出它的目的讓使用者可以的將嵌入式作業系統移植到特定的平臺上。
3.1 BSP的安裝
讓Windows CE 5.0能在實驗箱上執行起來,還安裝XSBase270的板級支援包(BSP)。板級支援包是介於主機板和作業系統中驅動程式之間的一層,它屬於作業系統的一,主要是對作業系統的支援,為上層的驅動程式訪問硬體裝置暫存器的函式包。
在PC上安裝好Windows CE.net5.0和Platform Builder5.0後,開啟實驗箱附帶光碟中的BSP資料夾,執行XSBase270_V010106.msi檔案,安裝XSBase270的BSP。如圖3-1所示。
圖3-1 BSP安裝程式檔案
安裝好BSP後,Platform Builder5.0中定製基於“EMDOOR SYSTEMS XSBASE270:ARMV4I”的因特網應用型別的系統映象設計[4]。如圖3-2所示。
圖3-2 定製系統時選擇BSP種類
3.2 新增平臺特徵和配置平臺
使系統在定製後能夠的應用,並對某些裝置的支援,就要向所設計的平臺中新增必要的特徵。
(1)新增USB Active Sync(File Sync)元件。新增此元件,才能使用PC的USB介面與Windows CE檔案同步。這在應用軟體除錯過程中所的條件。
(Catalog->Core OS->Windows CE devices->Applications-End User->ActiveSync->File Sync)
(2)新增Chinese[Simplified] Font。安裝中文簡體字型後,才能顯示中文。
(Catalog->Core OS->Windows CE devices->International->Locale Specific Support->Chinese[Simpified]->Fonts)
(3)新增檔案系統支援。
(Catalog -> Core OS -> Windows CE devices -> File Systems and Data Store -> Storage Manager -> FAT File System)
(4)新增分割槽管理
(Catalog -> Core OS -> Windows CE devices -> File Systems and Data Store -> Storage Manager ->Partition Driver)
(5)新增控制面板中的儲存器管理元件
(Catalog -> Core OS -> Windows CE devices -> File Systems and Data Store -> Storage Manager -> Storage Manager Control Panel Applet)
(6)新增基於軟體的輸入系統(軟鍵盤等)
( Catalog -> Core OS -> Windows CE devices -> Shell and User Interface -> User Interface -> Software Input Panel -> Software-based Input Panel (SIP) (Choose 1 or more) -> SIP for Large Screens)
(7)新增平臺管理器(Platform Manager)
(Catalog -> Platform Manager -> Platform Manager)
(8)新增Usb ActiveSync(USB Function)
(Catalog -> Third Party -> BSPs -> Emdoor Systems XSBase270: ARMV4I -> Device Drivers -> USB Function->USB Function Bus Drivers ->PXA27x USB Function)
特性的新增後,設定平臺的屬性。在“Platform”選單下單擊“Setting”,在Configuration下拉選單中選擇“Emdoor Systems XSBase270:ARMV4I Release”項,選擇Locale選項卡,系統地理位置和環境語言支援的設定。Locales列表中,為最下
端的“中文()”項打勾。在Default Language下拉選單裡選擇“中文()”為系統的預設語言。如圖3-3所示。圖3-3 選擇作業系統預設語言
在Build Option列表中,只選擇Enable Eboot Space in Memory(IMGEBOOT=1)和Write Run-time Image to Flash Memory(IMGFLASH=1)兩項。如圖3-4所示。
圖3-4 程式組建選項設定
單擊“Build OS”選單下的“Sysgen”開始組建作業系統。如圖3-5所示:
圖3-5 生成作業系統映象
3.3 紅外串列埠與藍芽串列埠的開啟
經測試,在預設配置下生成的系統映象,只打開了位於XSBase270模組板上的全功能除錯串列埠,而位於介面擴充套件板上的紅外串列埠和藍芽串列埠並被開啟。能夠與家電控制板和GSM模組連線,完整的智慧家居系統的功能,將它們開啟。
(1)查詢中斷號
中斷號的定義是在試驗箱所的板級支援包中被配置的。
開啟C:\WINCE500\Platform\XSBase270\Src\inc\bsp_cfg.h檔案。可以看到除錯串列埠和通訊串列埠的中斷號的定義,如圖3-6所示。
圖3-6 BSP中的串列埠中斷定義
可以看到除錯串列埠BFUART的中斷號是28,轉化為16進製為0x1c;通訊串列埠SFUART中斷號27,轉換為16進位制是0x1b。
(2)修改登錄檔
開啟資料夾,“F:\platform\270\”是在新建作業系統平臺時所儲存它的磁碟位置。
F:\Platform\270\RelDir\XSBase270_ARMV4I_Release\
開啟platform.reg登錄檔檔案,檔案中包含了對硬體的初始化的程式碼。
在“IF BSP_NOSERIAL!”與“END BSP_NOSERIAL!”兩句程式碼之間,可以看到藍芽串列埠的登錄檔初始化程式碼,下面只需要新增初始化紅外串列埠的程式碼:
;Open the IR Serial Port
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SerialIR]
"Irq"=dword:14 ; 20 IRQ_STUART
"SysIntr"=dword:1b ; 27 SYSINTR_SFUART
"MemBase"=dword:40700000 ; STUART Register
"MemLen"=dword:40
"DeviceArrayIndex"=dword:82 ; STUART object
"Prefix"="COM"
"Index"=dword:3
"Order"=dword:1
"IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}" ;
"Dll"="ms2_serial.dll"
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SerialIR\Unimodem]
"Tsp"="Unimodem.dll"
"DeviceType"=dword:0
"FriendlyName"="IRSerial Cable on COM3:"
"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
修改好登錄檔程式碼以後,儲存platform.reg檔案。開啟剛才的作業系統設計工程,選擇Build OS選單下的Make Run-Time Image命令,生成新的核心檔案NK.bin。
3.4 作業系統的生成與下載
定製並組建Windows CE後,將會生成BootLoader——EBOOT.nb0檔案和NK核心——nk.bin,將它們燒寫XSBase270實驗箱。
4 應用軟體設計
4.1 應用程式編寫環境
開發環境:Microsoft Visual Studio 2005
開發語言:Microsoft Visual C++ 2005
軟體開發包:XSBase270 SDK
智慧家居系統的應用程式採用Visual Studio 2005開發。Visual Studio是微軟公司開發的Windows平臺上的應用程式開發環境。Visual Studio可以建立Windows 下的Windows應用程式和網路應用程式,也可以用來建立網路服務、智慧裝置應用程式和Office外掛[5]。Visual Studio 2005面向.net框架(2.0版本),可以開發跨平臺的應用程式。
圖4-1 Visual Studio 2005
4.2 智慧家居人機介面設計
開啟Visual Studio 2005,建立基於MFC Smart Device Application的VC++程式。如圖4-2所示:
圖4-2 新建智慧家居的應用程式
到選擇平臺時選擇XSBase270平臺,刪除預設的Pocket PC 2003平臺。如圖4-3所示。
圖4-3 選擇軟體開發包支援
單擊“Next”按鈕選擇應用程式型別和資源語言——程式介面上採用的語言的畫面。如圖4-4所示,選擇“Dialog based”(基於對話方塊)型別,資源語言選擇“中文()”。專案保留預設的選項。
圖4-4 選擇應用程式種類
預設的設定,一直到新建專案嚮導。IDE環境。整合環境的視窗分佈如圖4-5所示:
圖4-5 Visual Studio 2005整合環境
將對話方塊設計成如圖4-6所示:
圖4-6 智慧家居操作介面設計
表4-1 智慧家居應用軟體介面控制元件配置
控制元件型別 |
控制元件名稱 |
功能 |
按鈕控制元件 |
初始化GSM |
初始化GSM模組 |
開始攝像 |
開啟攝像頭,開始視訊捕捉 |
|
停止攝像 |
停止攝像頭視訊捕捉 |
|
開始監聽 |
開啟ARM的9000號埠,開啟網路通訊 |
|
停止監聽 |
關閉埠,停止TCP通訊 |
|
冰箱 |
開啟家中的冰箱裝置 |
|
燈光 |
開啟家中的燈光裝置 |
|
微波爐 |
開啟家中的微波爐裝置 |
|
空調 |
開啟家中的空調裝置 |
|
關於 |
||
退出程式 |
關閉未關閉的執行緒,退出程式 |
|
列表控制元件 |
訊息視窗 |
用來顯示使用者發回的簡訊記錄 |
圖片控制元件 |
煤氣 |
煤氣感測器報警訊號,報警時紅色,常態時綠色 |
煙霧 |
煙霧感測器報警訊號,報警時紅色,常態時綠色 |
|
紅外 |
紅外感測器報警訊號,報警時紅色,常態時綠色 |
|
編輯框 |
資訊框 |
實時顯示系統執行情況 |
4.3串列埠通訊功能設計
4.3.1 串列埠通訊協議
串列埠通訊協議採用CCESeries類,對此類的函式的呼叫,對串列埠的初始化、讀寫操作等,在不用串列埠的情況下,還可以關閉串列埠。
4.3.2 軟體的
在Visual Studio的解決方案視圖裡新增類CCESeries,如圖4-7所示。CCESeries類的函式如表4-2所示。
圖4-7 在VS2005中CCESeries類
表4-2 串列埠操作類CCESeries的函式
函式作用 |
函式名稱 |
開啟串列埠 |
BOOL OpenPort(HWND pPortOwner, UINT portNo = 1, UINT baud= 9600,UINT parity= NOPARITY, UINT databits= 8,UINT stopbits= 0 ); |
關閉串列埠 |
Void ClosePort(); |
設定串列埠超時 |
BOOL SetSeriesTimeouts(COMMTIMEOUTS CommTimeOuts); |
讀串列埠執行緒 |
Static DWORD WINAPI ReadThreadFunc(LPVOID lparam); |
寫串列埠 |
BOOL WritePort(LPCTSTR lpString); BOOL WritePort(char *buf,int nSize); BOOL WritePort(char *buf); |
關閉讀執行緒 |
Void CloseReadThread(); |
表4-3 串列埠操作類CCESeries的變數
變數型別 |
變數名稱 |
作用 |
HANDLE |
m_hComm |
已開啟的串列埠控制代碼 |
HWND |
m_hWnd |
此串列埠類所屬的視窗控制代碼 |
HANDLE |
m_hReadThread |
讀串列埠執行緒控制代碼 |
HANDLE |
m_hWriteThread |
寫串列埠執行緒控制代碼 |
DWORD |
m_dwReadThreadID |
讀串列埠執行緒ID |
DWORD |
m_dwWriteThreadID |
寫串列埠執行緒ID |
HANDLE |
m_hReadCloseEvent |
讀串列埠執行緒退出事件 |
HANDLE |
m_hWriteCloseEvent |
寫串列埠執行緒退出事件 |
4.2.2.1 開啟串列埠與配置串列埠
在Windows CE中,驅動程式分為本地裝置驅動和流裝置驅動兩種[6]。本地裝置如鍵盤、觸控式螢幕等,在裝置生產後是不會再更換的,的驅動裝置的驅動程式必需的。而流介面裝置驅動程式可以由方,支援新增到系統中的裝置。而串列埠就屬於流介面裝置。
流裝置驅動在系統中是以三位字串後跟一位數字表示的,串列埠而言,這三位字元是“COM”(不包括引號)。當引用流介面驅動程式時,除了三位字元後跟一位數字以外,還要緊跟冒號“:”(英文半形冒號),冒號是必需的,是區別桌面Windows的裝置驅動程式的命名規則。
該函式的流程圖如圖4-8所示:
圖4-8 OpenPort函式流程圖
(1)串列埠的開啟所流驅動程式都將採用CreateFile函式開啟串列埠裝置。在Windows CE下,系統不支援裝置的重疊I/O,在引數dwFlagsAndAttributes中傳遞FILE_FLAG_OVERLAPPED標誌,返回的控制代碼要麼是已開啟的串列埠埠的控制代碼,或者是INVAILID_HANDLE_VALUE。CreateFile與大多數Windows函式不一樣,開啟失敗時,不返回0。
CreateFile函式的原型如下:
HANDLE CreateFile(
LPCTSTR lpFileName, // 路徑名
DWORD dwDesiredAccess, //控制模式
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //安全屬性(也即銷燬)
DWORD dwCreationDisposition, // 建立的
DWORD dwFlagsAndAttributes, // 屬性
HANDLE hTemplateFile // 檔案模板控制代碼
);
在CCESeries類中, HANDLE型別全域性變數m_hComm儲存CreateFile函式開啟串列埠時的返回值,憑藉此控制代碼可以控制開啟的串列埠;以讀寫的開啟串列埠。
(2)串列埠的設定
開啟串列埠後,還對埠配置好的波特率、字元長度、停止位等等。在OpenPort函式中,使用兩個函式GetCommState和SetCommState來配置串列埠。
函式原型如下:
BOOL SetCommState(HANDLE hRle, LPDCB lpDCB);
BOOL GetCommState(HANDLE hFile, LPDCB lpDCB);
這兩個函式都包含了同樣的引數,即已開啟的串列埠的控制代碼和指向DCB結構的指標。DCB結構的設定如表4-4所示。
表4-4 OpenPort函式中的串列埠DCB配置
DCB定義專案 |
設定值 |
備註 |
BaudRate |
Baud |
設定波特率為傳入型參baud的值 |
fBinary |
TRUE |
二進位制模式 |
fParity |
TRUE |
支援奇偶校驗 |
ByteSize |
Databits |
設定資料位為傳入型參databits,範圍4~8 |
Parity |
NOPARITY |
校驗模式 |
StopBits |
Stopbits |
設定停止位為傳入型參stopbits |
fOutxCtsFlow |
TRUE |
串列埠輸出由埠的CTS線控制 |
fOutxDsrFlow |
TRUE |
串列埠輸出由埠的DSR線控制 |
fDtrSensitivity |
DTR_CONTROL_ENABLE |
續表4-4 OpenPort函式中的串列埠DCB配置
DCB定義專案 |
設定值 |
備註 |
fDsrSensitivity |
FALSE |
|
fTXContinueOnXoff |
TRUE |
串列埠接收緩衝區已滿時,且驅動程式已傳送了XOFF字元,則驅動程式停止傳送字元 |
fOutX |
FALSE |
XON/XOFF控制不用於控制序列輸出 |
fInX |
FALSE |
XON/XOFF控制不為輸入序列流使用 |
fErrorChar |
FALSE |
|
fNull |
FALSE |
序列驅動不忽略接收到的空位元組 |
fRtsControl |
RTS_CONTROL_ENABLE |
|
fAbortOnError |
FALSE |
串列埠錯誤時,並不終止串列埠讀寫 |
(3)串列埠超時設定
設定好串列埠驅動操作的配置後,必要的是,設定埠的超時值。所謂超時,是指Windows CE.net在讀串列埠和寫串列埠的自動返回前等待讀或寫操作的長度。在程式中,用兩個函式控制序列超時。
BOOL GetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts);
BOOL SetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts);
這兩個函式都包含了對應的序列裝置的控制代碼和COMMTIMEOUTS結構的指標,COMMTIMEOUTS結構定義為:
typedef struct _COMMTIMEOUTS{
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
DWORD ReadTotalTimeoutConstant;
DWROD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutConstant;
}COMMTIMEOUTS;
(4)的函式
設定串列埠的輸入輸出緩衝區。原型如下
BOOL SetupComm(HANDLE hFile, DWORD dwInQueue, DWORD dwOutQueue);
設定串列埠檢測的事件集。
SetCommMask(HANDLE hFile,DWORD dwEvtMask);
函式,可以使執行緒等待如表4-5中的常見的串列埠驅動程式事件。
表4-5 串列埠驅動程式事件
事件標誌 |
表達意義 |
EV_BREAK |
檢測到中斷 |
EV_CTS |
CTS更改狀態 |
EV_DSR |
Data Set Ready訊號更改狀態 |
EV_ERR |
序列驅動程式檢測到錯誤 |
EV_RKSD |
Receive Line Signal Detect 行更改狀態 |
EV_RXCHAR |
接收到字元 |
EV_RXFLAG |
接收到事件字元 |
EV_TXEMPTY |
傳輸緩衝區為空 |
4.2.2.2關閉串列埠
呼叫CloseHandle可以關閉串列埠,用關閉在開啟串列埠時建立的那個控制代碼即可關閉串列埠了。方法如下
CloseHandle(m_hComm);
關閉執行緒函式:
BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode);
,hThread為要關閉的執行緒的控制代碼。dwExitCode為0。若關閉,則返回非零值。關閉串列埠函式的工作流程如圖4-9所示。
SHAPE \* MERGEFORMAT
圖4-9 ClosePort函式流程圖
4.2.2.3 串列埠讀執行緒
讀串列埠ReadFile函式原形:
BOOL ReadFile(
HANDLE hFile, //檔案的控制代碼
LPVOID lpBuffer, //用於儲存讀入資料的緩衝區
DWORD nNumberOfBytesToRead, //要讀入的字元數
LPDWORD lpNumberOfBytesRead, //從檔案中讀入的字元數
LPOVERLAPPED lpOverlapped //非同步讀取描述,在Windows CE中為NULL
);
在該執行緒中,若串列埠讀完一條資訊,則傳送系統訊息到系統窗體,該訊息的名稱為WM_RXCHAR_ALL,是使用者自定義訊息。傳送給系統窗體的附帶訊息包含收到的訊息的內容和訊息的長度。
傳送系統訊息的API函式SendMessage的原型如下:
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
圖4-10 串列埠讀執行緒流程圖
4.2.2.4 寫串列埠
在CCESeries類中,一共編寫了三個寫串列埠的函式,為的是不同情況下的呼叫。如要向寫已知長度的字串,可以採用WritePort(char *buf,int nSize)函式。寫未知長度字串時,採用WritePort(char *buf)函式,字串的長度將在函式內部計算。前者了寫串列埠的。這三個函式中,採用了的API函式WriteFile(),它的函式原型如下:
BOOL WriteFile(
HANDLE hFile, // 檔案控制代碼
LPCVOID lpBuffer, // 資料快取區指標
DWORD nNumberOfBytesToWrite, // 要寫的位元組數
LPDWORD lpNumberOfBytesWritten, // 用於儲存寫入位元組數的儲存區域的指標
LPOVERLAPPED lpOverlapped // OVERLAPPED結構體指標,CE裡設為NULL
);
4.2.2.5 串列埠類的呼叫
在主程式中,呼叫此CCESeries類,以操作串列埠的目的。
在定義智慧家居的視窗的CSmartHomeDlg類的標頭檔案CSmartHomeDlg.h檔案中,新增CCESeries.h標頭檔案。並且新建public公共型變數m_BTSerial(藍芽串列埠)和m_IRSeries對CCESeries類的例項化。
CCESeries m_BTSerial;
CCESeries m_IRSerial;
在用於CSmartHomeDlg類函式的定義的檔案CSmartHomeDlg.cpp檔案中,採用形如m_BTSerial.OpenPort(this->m_hWnd,1,9600)的串列埠類函式的呼叫。
4.2.2.6 串列埠的監聽
在讀串列埠執行緒中,讀完串列埠的一條資訊後傳送名為WM_RXCHAR_ALL的系統訊息給系統窗體。在窗體程式中,對其響應。
在CSmartHomeDlg.cpp檔案中,新增一條訊息響應的宣告:
ON_MESSAGE(WM_RXCHAR_ALL,OnComRecvMsg)
OnComRecvMsg為對其訊息響應的函式,函式的宣告如下:
afx_msg long OnComRecvMsg(WPARAM wParam, LPARAM lParam);
“afx_msg”說明該函式是一訊息響應函式。
4.4 GSM通訊模組
智慧家居以GSM網路資料的無線傳輸網路,基於GSM網路上的簡訊息服務,智慧家居的遠端安全監控和無線報警的功能。
4.4.1 設計原理
4.4.1.1 PDU編碼規則
自簡訊息技
術被開發到現在,對簡訊息的控制包含了Block Mode、基於AT的Text Mode基於AT指令的PDU Mode。使用Block模式需要廠家驅動的支援,技術的發展,後兩種模式將其取代。Text模式簡單,但傳送中文簡訊息。在智慧家居的軟體設計中,採用的是基於PDU模式,該模式支援各個語言,當然也包括中文。在智慧家居中,採用中文報警和中文指令。
PDU資料包格式,是手機發送簡訊的資料[7]。的傳送源手機號碼、短訊息服務中心號碼(SMSC)、戳等用壓縮BCD碼錶示,低位在前,高位在後。在PDU模式中,可採用Bit7、Bit8和UCS2編碼對短訊息傳送內容編碼。這三種編碼可以傳送的最大字元數分別為160,140和70。
Bit7