智能家居系統中的上位機設計
0 引言
上位機設計是智能家居系統的一個(gè)重要組成部分,擔負著(zhù)管理、控制、維護和用戶(hù)界面操作的重任,高效可靠的上位機設計是整個(gè)系統正常運作的重要保障。上位機與系統的通信實(shí)際上是與下端單片機的通信。單片機或單片機系統是智能家居控制的核心,當計算機作為單片系統的一個(gè)角色時(shí),通常被稱(chēng)為“工控機”或“上位機”,各獨立的單片機是系統中實(shí)現功能的一個(gè)模塊,所以有時(shí)也稱(chēng)單片機為模塊。
計算機與單片機是通過(guò)串口來(lái)實(shí)現通信的,本文著(zhù)重討論計算機與單片機的串口通信的實(shí)現方法和MSComm控件技術(shù)。
1上位機在智能家居系統的角色
首先,必須認識計算機在智能家居系統的作用,可以概括為以下幾個(gè)方面:
1.1 通信測試工具
傳統的單片機系統的通信測試通過(guò)示波器來(lái)監測,既不直觀(guān)又容易丟失信息。將計算機加入到系統中,可以實(shí)時(shí)監測到線(xiàn)路中的信息,并以數字化呈現,使各個(gè)單片機間的通信得到檢驗,及時(shí)解決系統存在的問(wèn)題。所以計算機在加速系統的開(kāi)發(fā)和保證系統的運行質(zhì)量的作用就不言而喻了。
1.2 系統維護
一個(gè)單片機系統往往需要對系統中各個(gè)不同功能的模塊(單片機)進(jìn)行參數的設置,以適應不同的運行環(huán)境,雖然可以通過(guò)各模塊的控制面板來(lái)調整,但操作通常比較麻煩,非專(zhuān)業(yè)人員不易掌握。同時(shí)對于一些需要定義其地理位置的參數難以實(shí)現,不夠直觀(guān)。計算機加入到系統中,不但可以解決操作上的問(wèn)題,同時(shí)還可以讀取各模塊的參數,以便于調整。
1.3 單片機
計算機可以作為單片機系統的一個(gè)模塊,完成相應的功能。計算機應答系統的請求、處理系統中的信息,一方面將信息呈現給用戶(hù),另一方面計算機程序通過(guò)自動(dòng)計算或用戶(hù)的輸入,將信息反饋到系統中,參與系統的控制。
1.4 主控機
在單片機系統中,往往存在一個(gè)主控機或主控模塊,負責對整個(gè)系統的統籌和設置。單片機系統通常是通過(guò)各功能模塊的輸入和響應來(lái)實(shí)現其功能的,因此必須有一個(gè)負責收集輸入任務(wù)并指定響應模塊的主控模塊。計算機系統中既可以是一個(gè)普通的模塊,又可以是負責總體協(xié)調的主控器。
2 通信協(xié)議
一個(gè)單片機系統是由硬件系統和軟件系統構成的。硬件是實(shí)現功能的前提,而系統功能則是通過(guò)軟件來(lái)實(shí)現的,為了保證各個(gè)模塊通信,實(shí)現系統信息交流,必須制訂系統的通信協(xié)議。
從物理上來(lái)說(shuō),系統各模塊是以半雙工的模式來(lái)通信的,下文提及的智能照明系統下端模塊就是以半雙工的RS 485總路線(xiàn)為通信架構的。而計算機的RS 232串口是以全雙工的模式來(lái)實(shí)現通信的,因此,計算機要通過(guò)串口參與到單片機系統中必須增加一個(gè)RS 232和RS 485總線(xiàn)轉換的模塊。
從邏輯上講,要實(shí)現各模塊之間的通信,就必須在模塊間約定一個(gè)共同遵守的通信協(xié)議。單片機以位(b)為基本單位,傳輸時(shí)以8位1字節(B)來(lái)傳輸,單片機以毫秒間距發(fā)送若干個(gè)字節為一個(gè)數據包,也稱(chēng)為一幀,幀之間又規定若干毫秒的間隙。通過(guò)計算機程序可以捕獲線(xiàn)路中每一幀信息。
下面以智能照明系統為例,講述單片機系統的通信協(xié)議。
本協(xié)議采用異步串行通信方式,字節幀格式:1個(gè)起始位+8個(gè)數據位+1個(gè)停止位,無(wú)校驗位。
幀格式如下:
l幀=幀頭(F4H F5H)+數據包+幀尾(F4HFBH)255B
數據包=有效字節數(1B)+傳輸層數據+校驗和(1B)251B
幀數據的發(fā)送、接收過(guò)程中前后兩字節數據傳送延時(shí)不得超過(guò)O.5s。
各模塊分配兩個(gè)字節的地址碼,第一字節代表模塊類(lèi)型,第二字節代表模塊在系統中分配的順序。各模塊獲取總線(xiàn)上的幀后,對自己的地址幀響應,其他的幀拋掉。
以下是本協(xié)議中的關(guān)于“燈開(kāi)??刂啤钡膮f(xié)議:
描述:該信息是輸出子模塊的各路燈的開(kāi)或關(guān)控制。
構成:該信息發(fā)送時(shí)由信息頭和信息內容構成,返回時(shí)由信息頭構成。
主控器或PC機發(fā)給輸出模塊時(shí):

系統的通信按照規定的各條協(xié)議來(lái)執行。
3 計算機通信的實(shí)現
計算機硬件上通過(guò)RS 232與RS 485接口轉換與下端模塊進(jìn)行通信。而軟件的實(shí)現有多種方法,下面主要介紹在VB 6.0通過(guò)MSComm控件來(lái)實(shí)現通信的方法。
3.1 將MSComm控件引入到VB平臺
MSComm控件通過(guò)串行端口傳輸和接收數據,為應用程序提供串行通訊功能。MSComm控件在串口編程時(shí)非常方便,程序員不必去花時(shí)間去了解較為復雜的API函數,而且在VC,VB,Delphi等語(yǔ)言中均可使用。
MSComm是Mierosoft公司提供的簡(jiǎn)化Windows下串行通信編程的ActiveX控件,它為應用程序提供了通過(guò)串行接口收發(fā)數據的簡(jiǎn)便方法。具體的來(lái)說(shuō),它提供了兩種處理通信問(wèn)題的方法:一是事件驅動(dòng)(Eventdriyen)方法,一是查詢(xún)法。
3.2 MSComm控件的設置
3.2.1 MSComm控件的屬性
MSComm控件有很多重要的屬性,正確設置其屬性是程序進(jìn)行正常通信的保證,下面介紹幾個(gè)必須熟悉的屬性。
CommPort:設置并返回通訊端口號。
Settings:以字符串的形式設置并返回波特率、奇偶校驗、數據位、停止位。
PortOpen:設置并返回通訊端口的狀態(tài),也可以打開(kāi)和關(guān)閉端口。
Input:從接收緩沖區返回和刪除字符。
InputMode:接收模式,取O值時(shí),接收文本數據;取1時(shí),接收二進(jìn)制數據。
Output:向傳輸緩沖區寫(xiě)一個(gè)字符串。
Rthrehold:響應模式,取整數。當接收字符后,若Rthrehold屬性設置為O,則不產(chǎn)生OnComm事件;若設置為1,則接收緩沖區收到每一個(gè)字符都會(huì )使MSComm控件產(chǎn)生OnComm事件。
Sthreshold:發(fā)送模式,設置O(缺省值),數據傳輸事件不會(huì )產(chǎn)生OnComm事件;設置為1,當傳輸緩沖區完全空時(shí),MSComm控件產(chǎn)生OnComm事件。如果在傳輸緩沖區中的字符數小于value,CommEvent屬性設置為comEvSend,并產(chǎn)生OnComm事件。
Handshake:通信握手模式,取值為O時(shí),無(wú)握手;取值為1時(shí),表示XOn/Xoff握手;取值為2時(shí),表示Request-to-send/clear-to-send握手;取值為3時(shí),表示eqLlest-to-sendclear-to-send握手皆可。
3.2.2 MSComm控件兩種處理通訊的方式
MSComm控件提供下列兩種處理通訊的方式:事件驅動(dòng)方式和查詢(xún)方式。
(1)事件驅動(dòng)方式
事件驅動(dòng)通訊是處理串行端口交互作用的一種非常有效的方法。在許多情況下,在事件發(fā)生時(shí)需要得到通知,例如,在串口接收緩沖區中有字符,或者CarrierDetect(CD)或Request To Send(RTS)線(xiàn)上一個(gè)字符到達或一個(gè)變化發(fā)生時(shí)。在這些情況下,可以利用MSComm控件的OnComm事件捕獲并處理這些通訊事件。OnComm事件還可以檢查和處理通訊錯誤。所有通訊事件和通訊錯誤的列表,參閱CommEvent屬性。在編程過(guò)程中,就可以在OnComm事件處理函數中加入自己的處理代碼。這種方法的優(yōu)點(diǎn)是程序響應及時(shí),可靠性高。每個(gè)MSComm控件對應著(zhù)一個(gè)串行端口。如果應用程序需要訪(fǎng)問(wèn)多個(gè)串行端口,必須使用多個(gè)MSComm控件。
(2)查詢(xún)方式
查詢(xún)方式實(shí)質(zhì)上還是事件驅動(dòng),但在有些情況下,這種方式顯得更為便捷。在程序的每個(gè)關(guān)鍵功能之后,可以通過(guò)檢查CommEvent屬性的值來(lái)查詢(xún)事件和錯誤。如果應用程序較小,并且是自保持的,這種方法可能是更可取的。例如,如果寫(xiě)一個(gè)簡(jiǎn)單的電話(huà)撥號程序,則沒(méi)有必要對每接收一個(gè)字符都產(chǎn)生事件,因為惟一等待接收的字符是調制解調器的“確定”響應。
3.3 計算機信息發(fā)送和接收的實(shí)現
下面以智能照明系統中PC機與主控器的通信,說(shuō)明計算機與單片機通信的實(shí)現方法。以下是實(shí)現的主要子程序。
頁(yè)面裝載程序:

通信建立后,計算機就可以與下端單片機通過(guò)設定的協(xié)議進(jìn)行通信,可以測試下端模塊的響應。
4 MSComm控件的問(wèn)題和解決辦法
在實(shí)際應用中,MSComm控件對于一問(wèn)一答式的通信,效果還是可以的,所以用于單模塊的通信測試問(wèn)題不大。但是,如果計算機作為單片系統的一個(gè)角色,要實(shí)時(shí)捕獲總線(xiàn)上的信息并響應,存在失幀和誤幀的問(wèn)題,如果系統要求不高,還可以對付,而象智能照明這樣要求信息持續、實(shí)時(shí)、準確的系統,利用MSComm控件處理串口通信就難以勝任了。
在智能照明系統中,采用了自編制的動(dòng)態(tài)庫Transdata,dll程序,作為處理串口通信的接口,誤幀率和失幀率較低,能滿(mǎn)足產(chǎn)品化的要求。
Transdata.dll使用說(shuō)明:
(1)初始化串口并處于通訊狀態(tài)函數>
Init_OpenCom(byval m_str as string,byval nbaud as Integer)as Boolean
參數說(shuō)明:m_str為串口名稱(chēng),如“coml”“com2”等;nbaud為波特率,可為1200,2400,4800,9600等;返回值為Boolean,若為true則成功,否則失敗false。
(2)關(guān)閉串口結束通訊過(guò)程>
CloseCom()
(3)發(fā)送通訊數據過(guò)程>
SendData(n_str as byte,byval ncount as Integer)
參數說(shuō)明:n_str為要發(fā)送byte的數組的第一個(gè)字節;如要發(fā)dim ndata(11)as byte這個(gè)數組,只需用ndata(0)作為n_str參數即可;nc-ount為要發(fā)送的字節數。
(4)接收返回的數據函數>
GetData(byval m_str as string)as string
參數說(shuō)明:m_str必須為已有能容納所要接收字串的長(cháng)度空間返回接收到的字串,各個(gè)字節以“t”隔開(kāi)。
5 結語(yǔ)
利用MSComm控件雖然可以方便快捷編制出的上位機程序,但其通信效率偏低,誤幀和失幀率較高,只適用于單模塊測試。對于多模塊實(shí)時(shí)通信系統,宜采用其他控件或自編制更有效的收發(fā)程序。
評論