摘 要:在智能家居系統(tǒng)設計中,串行通信是實現上位機與下端模塊通信的最主要的手段。為了提高上位機與下端模塊的通信效率,在上位機設計時通過使用Windows的MSComm控件和自編制的串口接收發(fā)送動態(tài)控件的比較,發(fā)現利用MSComm控件雖然可以方便快捷地編制出上位機程序,但其通信效率偏低,誤幀和失幀率較高,只適用于單模塊測試。對于多模塊實時通信系統(tǒng),采用其他控件或自編制收發(fā)程序更為有效。
關鍵詞:上位機; 單片機; 智能家居系統(tǒng); 協議; 串行通信; MSComm控件
中圖分類號:TP18 文獻標識碼:A
文章編號:1004-373X(2010)13-0133-04
Upper Computer Control in Intelligent Home System Based on Serial Communication
JIANG Yong-chi
(Shantou Polytechnic College, Shantou515078, China)
Abstract: Serial communication is the most important communication method between upper computer control and lower model(MCU) in the design of intelligent home system. By comparison between MSComm control of Windows and self-written serial transcieving dynamic control during the design of the uppercomputer to improve the communication efficiency of the upper computer control and the model at lower end, it is found that the communication efficiency of the upper computer program written by MSComm control is low, and the rate of error-frame and lost-frame is high though the program can be written out quickly with MSComm control. Two different ways to test the serial port communication abbility and find the follow facts: MSComm control can only use in single model can′t use in a multi-model system.
Keywords: upper computer control; MCU; intelligent home system; protocols; serial communication; MSComm control
0 引 言
上位機設計是智能家居系統(tǒng)的一個重要組成部分,擔負著管理、控制、維護和用戶界面操作的重任,高效可靠的上位機設計是整個系統(tǒng)正常運作的重要保障。上位機與系統(tǒng)的通信實際上是與下端單片機的通信[1]。單片機或單片機系統(tǒng)是智能家居控制的核心,當計算機作為單片系統(tǒng)的一個角色時,通常被稱為“工控機”或“上位機”,各獨立的單片機是系統(tǒng)中實現功能的一個模塊,所以有時也稱單片機為模塊。
計算機與單片機是通過串口來實現通信的,本文著重討論計算機與單片機的串口通信的實現方法和MSComm控件技術。
1 上位機在智能家居系統(tǒng)的角色
首先,必須認識計算機在智能家居系統(tǒng)的作用,可以概括為以下幾個方面:
1.1 通信測試工具
傳統(tǒng)的單片機系統(tǒng)的通信測試通過示波器來監(jiān)測,既不直觀又容易丟失信息。將計算機加入到系統(tǒng)中,可以實時監(jiān)測到線路中的信息,并以數字化呈現,使各個單片機間的通信得到檢驗,及時解決系統(tǒng)存在的問題。所以計算機在加速系統(tǒng)的開發(fā)和保證系統(tǒng)的運行質量的作用就不言而喻了。
1.2 系統(tǒng)維護
一個單片機系統(tǒng)往往需要對系統(tǒng)中各個不同功能的模塊(單片機)進行參數的設置,以適應不同的運行環(huán)境,雖然可以通過各模塊的控制面板來調整,但操作通常比較麻煩,非專業(yè)人員不易掌握。同時對于一些需要定義其地理位置的參數難以實現,不夠直觀。計算機加入到系統(tǒng)中,不但可以解決操作上的問題,同時還可以讀取各模塊的參數,以便于調整[2]。
1.3 單片機
計算機可以作為單片機系統(tǒng)的一個模塊,完成相應的功能。計算機應答系統(tǒng)的請求、處理系統(tǒng)中的信息,一方面將信息呈現給用戶,另一方面計算機程序通過自動計算或用戶的輸入,將信息反饋到系統(tǒng)中,參與系統(tǒng)的控制。
1.4 主控機
在單片機系統(tǒng)中,往往存在一個主控機或主控模塊,負責對整個系統(tǒng)的統(tǒng)籌和設置。單片機系統(tǒng)通常是通過各功能模塊的輸入和響應來實現其功能的,因此必須有一個負責收集輸入任務并指定響應模塊的主控模塊。計算機系統(tǒng)中既可以是一個普通的模塊,又可以是負責總體協調的主控器。
2 通信協議
一個單片機系統(tǒng)是由硬件系統(tǒng)和軟件系統(tǒng)構成的。硬件是實現功能的前提,而系統(tǒng)功能則是通過軟件來實現的,為了保證各個模塊通信,實現系統(tǒng)信息交流,必須制訂系統(tǒng)的通信協議。
從物理上來說,系統(tǒng)各模塊是以半雙工的模式來通信的,下文提及的智能照明系統(tǒng)下端模塊就是以半雙工的RS 485總路線為通信架構的。而計算機的RS 232串口是以全雙工的模式來實現通信的,因此,計算機要通過串口參與到單片機系統(tǒng)中必須增加一個RS 232和RS 485總線轉換的模塊[3]。
從邏輯上講,要實現各模塊之間的通信,就必須在模塊間約定一個共同遵守的通信協議。單片機以位(b)為基本單位,傳輸時以8位1字節(jié)(B)來傳輸,單片機以毫秒間距發(fā)送若干個字節(jié)為一個數據包,也稱為一幀,幀之間又規(guī)定若干毫秒的間隙。通過計算機程序可以捕獲線路中每一幀信息。
下面以智能照明系統(tǒng)為例,講述單片機系統(tǒng)的通信協議。
本協議采用異步串行通信方式,字節(jié)幀格式:1個起始位+8個數據位+1個停止位,無校驗位。
幀格式如下[4]:
1幀=幀頭(F4H F5H)+數據包+幀尾(F4H FBH) <255 B
數據包=有效字節(jié)數(1 B)+傳輸層數據+校驗和(1 B)<251 B
幀數據的發(fā)送、接收過程中前后兩字節(jié)數據傳送延時不得超過0.5 s。
各模塊分配兩個字節(jié)的地址碼,第一字節(jié)代表模塊類型,第二字節(jié)代表模塊在系統(tǒng)中分配的順序。各模塊獲取總線上的幀后,對自己的地址幀響應,其他的幀拋掉。
以下是本協議中的關于“燈開�?刂啤钡膮f議:
描述:該信息是輸出子模塊的各路燈的開或關控制。
構成:該信息發(fā)送時由信息頭和信息內容構成,返回時由信息頭構成。
主控器或PC機發(fā)給輸出模塊時:
MessageType53
MessageSubType0/2
Result0
信息內容:
第一字節(jié),燈號字節(jié)10:不相關,1:相關,bit7~bit0分別對應本模塊8~1號燈
第二字節(jié),燈號字節(jié)10:不相關,1:相關,bit6~bit0分別對應本模塊15~9號燈
第三字節(jié),開度值0:關,1~63亮度值:開,128:突關,255:突關
第四字節(jié),變光時間0~255
輸出模塊返回給主控器時,信息頭定義如下:
MessageType53
MessageSubType0/2
ResultDependent on operation(1 or 0)
系統(tǒng)的通信按照規(guī)定的各條協議來執(zhí)行。
3 計算機通信的實現
計算機硬件上通過RS 232與RS 485接口轉換與下端模塊進行通信。而軟件的實現有多種方法,下面主要介紹在VB 6.0通過MSComm控件來實現通信的方法[5]。
3.1 將MSComm控件引入到VB平臺
MSComm 控件通過串行端口傳輸和接收數據,為應用程序提供串行通訊功能。MSComm控件在串口編程時非常方便,程序員不必去花時間去了解較為復雜的API函數[6],而且在VC,VB,Delphi等語言中均可使用。
MSComm是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件,它為應用程序提供了通過串行接口收發(fā)數據的簡便方法。具體的來說,它提供了兩種處理通信問題的方法:一是事件驅動(Event-driven)方法,一是查詢法。
3.2 MSComm控件的設置
3.2.1 MSComm控件的屬性
MSComm控件有很多重要的屬性,正確設置其屬性是程序進行正常通信的保證,下面介紹幾個必須熟悉的屬性[7] 。
CommPort:設置并返回通訊端口號。
Settings:以字符串的形式設置并返回波特率、奇偶校驗、數據位、停止位。
PortOpen:設置并返回通訊端口的狀態(tài),也可以打開和關閉端口。
Input:從接收緩沖區(qū)返回和刪除字符。
InputMode:接收模式,取0值時,接收文本數據;取1時,接收二進制數據。
Output:向傳輸緩沖區(qū)寫一個字符串。
Rthrehold:響應模式,取整數。當接收字符后,若Rthrehold屬性設置為 0,則不產生OnComm 事件;若設置為1,則接收緩沖區(qū)收到每一個字符都會使 MSComm控件產生OnComm事件。
Sthreshold:發(fā)送模式,設置0(缺省值),數據傳輸事件不會產生OnComm事件;設置為1,當傳輸緩沖區(qū)完全空時,MSComm控件產生OnComm 事件。如果在傳輸緩沖區(qū)中的字符數小于value,CommEvent 屬性設置為comEvSend,并產生OnComm 事件。
Handshake:通信握手模式,取值為0時,無握手;取值為1時,表示XOn/Xoff握手;取值為2時,表示Request-to\\-send/clear-to-send握手;取值為3時,表示equest-to-send & clear-to-send握手皆可。
3.2.2 MSComm控件兩種處理通訊的方式
MSComm控件提供下列兩種處理通訊的方式:事件驅動方式和查詢方式[8]。
(1) 事件驅動方式
事件驅動通訊是處理串行端口交互作用的一種非常有效的方法。在許多情況下,在事件發(fā)生時需要得到通知,例如,在串口接收緩沖區(qū)中有字符,或者Carrier Detect(CD)或Request To Send(RTS)線上一個字符到達或一個變化發(fā)生時。在這些情況下,可以利用MSComm控件的OnComm事件捕獲并處理這些通訊事件。OnComm事件還可以檢查和處理通訊錯誤。所有通訊事件和通訊錯誤的列表,參閱CommEvent屬性。在編程過程中,就可以在OnComm事件處理函數中加入自己的處理代碼。這種方法的優(yōu)點是程序響應及時,可靠性高。每個MSComm控件對應著一個串行端口。如果應用程序需要訪問多個串行端口,必須使用多個MSComm控件。
(2) 查詢方式
查詢方式實質上還是事件驅動,但在有些情況下,這種方式顯得更為便捷。在程序的每個關鍵功能之后,可以通過檢查CommEvent屬性的值來查詢事件和錯誤。如果應用程序較小,并且是自保持的,這種方法可能是更可取的。例如,如果寫一個簡單的電話撥號程序,則沒有必要對每接收一個字符都產生事件,因為惟一等待接收的字符是調制解調器的“確定”響應。
3.3 計算機信息發(fā)送和接收的實現
下面以智能照明系統(tǒng)中PC機與主控器的通信,說明計算機與單片機通信的實現方法。以下是實現的主要子程序。
頁面裝載程序:
Private Sub Form Load()
com sl="com1"
bauty=9600
For i=0 To 59
Text2(i).Text=""
Next i
Open "recieve.txt" For Output As #1
End Sub
MSComm控件的設置程序:
Private Sub Command1 Click()
com sl=Combo1.Text
bauty=Combo2.Text
convert=Check1.Value
Form2.Hide
Form1.Command6.Enabled=False
Form1.Command4.Enabled=True
End Sub
通信口控制子程序:
Private Sub Command4 Click()
Select Case bauty
Case 1200
MSComm1.Settings="1200,n,8,1"
Case 2400
MSComm1.Settings="2400,n,8,1"
Case 9600
MSComm1.Settings="9600,n,8,1"
Case 19200
MSComm1.Settings="19200,n,8,1"
…
Case 57600
MSComm1.Settings="57600,n,8,1"
End Select
If com sl="com1" Then MSComm1.CommPort=1
…
If com sl="com7" Then MSComm1.CommPort=7
MSComm1.RThreshold=0
If MSComm1.PortOpen=False Then
MSComm1.PortOpen=True
End If
Command4.Enabled=False
Command5.Enabled=True
Command3.Enabled=False
If convert Then MSComm1.RTSEnable=True
End Sub
通信建立后,計算機就可以與下端單片機通過設定的協議進行通信,可以測試下端模塊的響應。
4 MSComm控件的問題和解決辦法
在實際應用中,MSComm控件對于一問一答式的通信,效果還是可以的,所以用于單模塊的通信測試問題不大。但是,如果計算機作為單片系統(tǒng)的一個角色,要實時捕獲總線上的信息并響應,存在失幀和誤幀的問題[9],如果系統(tǒng)要求不高,還可以對付,而象智能照明這樣要求信息持續(xù)、實時、準確的系統(tǒng),利用MSComm控件處理串口通信就難以勝任了[10]。
關鍵詞:上位機; 單片機; 智能家居系統(tǒng); 協議; 串行通信; MSComm控件
中圖分類號:TP18 文獻標識碼:A
文章編號:1004-373X(2010)13-0133-04
Upper Computer Control in Intelligent Home System Based on Serial Communication
JIANG Yong-chi
(Shantou Polytechnic College, Shantou515078, China)
Abstract: Serial communication is the most important communication method between upper computer control and lower model(MCU) in the design of intelligent home system. By comparison between MSComm control of Windows and self-written serial transcieving dynamic control during the design of the uppercomputer to improve the communication efficiency of the upper computer control and the model at lower end, it is found that the communication efficiency of the upper computer program written by MSComm control is low, and the rate of error-frame and lost-frame is high though the program can be written out quickly with MSComm control. Two different ways to test the serial port communication abbility and find the follow facts: MSComm control can only use in single model can′t use in a multi-model system.
Keywords: upper computer control; MCU; intelligent home system; protocols; serial communication; MSComm control
0 引 言
上位機設計是智能家居系統(tǒng)的一個重要組成部分,擔負著管理、控制、維護和用戶界面操作的重任,高效可靠的上位機設計是整個系統(tǒng)正常運作的重要保障。上位機與系統(tǒng)的通信實際上是與下端單片機的通信[1]。單片機或單片機系統(tǒng)是智能家居控制的核心,當計算機作為單片系統(tǒng)的一個角色時,通常被稱為“工控機”或“上位機”,各獨立的單片機是系統(tǒng)中實現功能的一個模塊,所以有時也稱單片機為模塊。
計算機與單片機是通過串口來實現通信的,本文著重討論計算機與單片機的串口通信的實現方法和MSComm控件技術。
1 上位機在智能家居系統(tǒng)的角色
首先,必須認識計算機在智能家居系統(tǒng)的作用,可以概括為以下幾個方面:
1.1 通信測試工具
傳統(tǒng)的單片機系統(tǒng)的通信測試通過示波器來監(jiān)測,既不直觀又容易丟失信息。將計算機加入到系統(tǒng)中,可以實時監(jiān)測到線路中的信息,并以數字化呈現,使各個單片機間的通信得到檢驗,及時解決系統(tǒng)存在的問題。所以計算機在加速系統(tǒng)的開發(fā)和保證系統(tǒng)的運行質量的作用就不言而喻了。
1.2 系統(tǒng)維護
一個單片機系統(tǒng)往往需要對系統(tǒng)中各個不同功能的模塊(單片機)進行參數的設置,以適應不同的運行環(huán)境,雖然可以通過各模塊的控制面板來調整,但操作通常比較麻煩,非專業(yè)人員不易掌握。同時對于一些需要定義其地理位置的參數難以實現,不夠直觀。計算機加入到系統(tǒng)中,不但可以解決操作上的問題,同時還可以讀取各模塊的參數,以便于調整[2]。
1.3 單片機
計算機可以作為單片機系統(tǒng)的一個模塊,完成相應的功能。計算機應答系統(tǒng)的請求、處理系統(tǒng)中的信息,一方面將信息呈現給用戶,另一方面計算機程序通過自動計算或用戶的輸入,將信息反饋到系統(tǒng)中,參與系統(tǒng)的控制。
1.4 主控機
在單片機系統(tǒng)中,往往存在一個主控機或主控模塊,負責對整個系統(tǒng)的統(tǒng)籌和設置。單片機系統(tǒng)通常是通過各功能模塊的輸入和響應來實現其功能的,因此必須有一個負責收集輸入任務并指定響應模塊的主控模塊。計算機系統(tǒng)中既可以是一個普通的模塊,又可以是負責總體協調的主控器。
2 通信協議
一個單片機系統(tǒng)是由硬件系統(tǒng)和軟件系統(tǒng)構成的。硬件是實現功能的前提,而系統(tǒng)功能則是通過軟件來實現的,為了保證各個模塊通信,實現系統(tǒng)信息交流,必須制訂系統(tǒng)的通信協議。
從物理上來說,系統(tǒng)各模塊是以半雙工的模式來通信的,下文提及的智能照明系統(tǒng)下端模塊就是以半雙工的RS 485總路線為通信架構的。而計算機的RS 232串口是以全雙工的模式來實現通信的,因此,計算機要通過串口參與到單片機系統(tǒng)中必須增加一個RS 232和RS 485總線轉換的模塊[3]。
從邏輯上講,要實現各模塊之間的通信,就必須在模塊間約定一個共同遵守的通信協議。單片機以位(b)為基本單位,傳輸時以8位1字節(jié)(B)來傳輸,單片機以毫秒間距發(fā)送若干個字節(jié)為一個數據包,也稱為一幀,幀之間又規(guī)定若干毫秒的間隙。通過計算機程序可以捕獲線路中每一幀信息。
下面以智能照明系統(tǒng)為例,講述單片機系統(tǒng)的通信協議。
本協議采用異步串行通信方式,字節(jié)幀格式:1個起始位+8個數據位+1個停止位,無校驗位。
幀格式如下[4]:
1幀=幀頭(F4H F5H)+數據包+幀尾(F4H FBH) <255 B
數據包=有效字節(jié)數(1 B)+傳輸層數據+校驗和(1 B)<251 B
幀數據的發(fā)送、接收過程中前后兩字節(jié)數據傳送延時不得超過0.5 s。
各模塊分配兩個字節(jié)的地址碼,第一字節(jié)代表模塊類型,第二字節(jié)代表模塊在系統(tǒng)中分配的順序。各模塊獲取總線上的幀后,對自己的地址幀響應,其他的幀拋掉。
以下是本協議中的關于“燈開�?刂啤钡膮f議:
描述:該信息是輸出子模塊的各路燈的開或關控制。
構成:該信息發(fā)送時由信息頭和信息內容構成,返回時由信息頭構成。
主控器或PC機發(fā)給輸出模塊時:
MessageType53
MessageSubType0/2
Result0
信息內容:
第一字節(jié),燈號字節(jié)10:不相關,1:相關,bit7~bit0分別對應本模塊8~1號燈
第二字節(jié),燈號字節(jié)10:不相關,1:相關,bit6~bit0分別對應本模塊15~9號燈
第三字節(jié),開度值0:關,1~63亮度值:開,128:突關,255:突關
第四字節(jié),變光時間0~255
輸出模塊返回給主控器時,信息頭定義如下:
MessageType53
MessageSubType0/2
ResultDependent on operation(1 or 0)
系統(tǒng)的通信按照規(guī)定的各條協議來執(zhí)行。
3 計算機通信的實現
計算機硬件上通過RS 232與RS 485接口轉換與下端模塊進行通信。而軟件的實現有多種方法,下面主要介紹在VB 6.0通過MSComm控件來實現通信的方法[5]。
3.1 將MSComm控件引入到VB平臺
MSComm 控件通過串行端口傳輸和接收數據,為應用程序提供串行通訊功能。MSComm控件在串口編程時非常方便,程序員不必去花時間去了解較為復雜的API函數[6],而且在VC,VB,Delphi等語言中均可使用。
MSComm是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件,它為應用程序提供了通過串行接口收發(fā)數據的簡便方法。具體的來說,它提供了兩種處理通信問題的方法:一是事件驅動(Event-driven)方法,一是查詢法。
3.2 MSComm控件的設置
3.2.1 MSComm控件的屬性
MSComm控件有很多重要的屬性,正確設置其屬性是程序進行正常通信的保證,下面介紹幾個必須熟悉的屬性[7] 。
CommPort:設置并返回通訊端口號。
Settings:以字符串的形式設置并返回波特率、奇偶校驗、數據位、停止位。
PortOpen:設置并返回通訊端口的狀態(tài),也可以打開和關閉端口。
Input:從接收緩沖區(qū)返回和刪除字符。
InputMode:接收模式,取0值時,接收文本數據;取1時,接收二進制數據。
Output:向傳輸緩沖區(qū)寫一個字符串。
Rthrehold:響應模式,取整數。當接收字符后,若Rthrehold屬性設置為 0,則不產生OnComm 事件;若設置為1,則接收緩沖區(qū)收到每一個字符都會使 MSComm控件產生OnComm事件。
Sthreshold:發(fā)送模式,設置0(缺省值),數據傳輸事件不會產生OnComm事件;設置為1,當傳輸緩沖區(qū)完全空時,MSComm控件產生OnComm 事件。如果在傳輸緩沖區(qū)中的字符數小于value,CommEvent 屬性設置為comEvSend,并產生OnComm 事件。
Handshake:通信握手模式,取值為0時,無握手;取值為1時,表示XOn/Xoff握手;取值為2時,表示Request-to\\-send/clear-to-send握手;取值為3時,表示equest-to-send & clear-to-send握手皆可。
3.2.2 MSComm控件兩種處理通訊的方式
MSComm控件提供下列兩種處理通訊的方式:事件驅動方式和查詢方式[8]。
(1) 事件驅動方式
事件驅動通訊是處理串行端口交互作用的一種非常有效的方法。在許多情況下,在事件發(fā)生時需要得到通知,例如,在串口接收緩沖區(qū)中有字符,或者Carrier Detect(CD)或Request To Send(RTS)線上一個字符到達或一個變化發(fā)生時。在這些情況下,可以利用MSComm控件的OnComm事件捕獲并處理這些通訊事件。OnComm事件還可以檢查和處理通訊錯誤。所有通訊事件和通訊錯誤的列表,參閱CommEvent屬性。在編程過程中,就可以在OnComm事件處理函數中加入自己的處理代碼。這種方法的優(yōu)點是程序響應及時,可靠性高。每個MSComm控件對應著一個串行端口。如果應用程序需要訪問多個串行端口,必須使用多個MSComm控件。
(2) 查詢方式
查詢方式實質上還是事件驅動,但在有些情況下,這種方式顯得更為便捷。在程序的每個關鍵功能之后,可以通過檢查CommEvent屬性的值來查詢事件和錯誤。如果應用程序較小,并且是自保持的,這種方法可能是更可取的。例如,如果寫一個簡單的電話撥號程序,則沒有必要對每接收一個字符都產生事件,因為惟一等待接收的字符是調制解調器的“確定”響應。
3.3 計算機信息發(fā)送和接收的實現
下面以智能照明系統(tǒng)中PC機與主控器的通信,說明計算機與單片機通信的實現方法。以下是實現的主要子程序。
頁面裝載程序:
Private Sub Form Load()
com sl="com1"
bauty=9600
For i=0 To 59
Text2(i).Text=""
Next i
Open "recieve.txt" For Output As #1
End Sub
MSComm控件的設置程序:
Private Sub Command1 Click()
com sl=Combo1.Text
bauty=Combo2.Text
convert=Check1.Value
Form2.Hide
Form1.Command6.Enabled=False
Form1.Command4.Enabled=True
End Sub
通信口控制子程序:
Private Sub Command4 Click()
Select Case bauty
Case 1200
MSComm1.Settings="1200,n,8,1"
Case 2400
MSComm1.Settings="2400,n,8,1"
Case 9600
MSComm1.Settings="9600,n,8,1"
Case 19200
MSComm1.Settings="19200,n,8,1"
…
Case 57600
MSComm1.Settings="57600,n,8,1"
End Select
If com sl="com1" Then MSComm1.CommPort=1
…
If com sl="com7" Then MSComm1.CommPort=7
MSComm1.RThreshold=0
If MSComm1.PortOpen=False Then
MSComm1.PortOpen=True
End If
Command4.Enabled=False
Command5.Enabled=True
Command3.Enabled=False
If convert Then MSComm1.RTSEnable=True
End Sub
通信建立后,計算機就可以與下端單片機通過設定的協議進行通信,可以測試下端模塊的響應。
4 MSComm控件的問題和解決辦法
在實際應用中,MSComm控件對于一問一答式的通信,效果還是可以的,所以用于單模塊的通信測試問題不大。但是,如果計算機作為單片系統(tǒng)的一個角色,要實時捕獲總線上的信息并響應,存在失幀和誤幀的問題[9],如果系統(tǒng)要求不高,還可以對付,而象智能照明這樣要求信息持續(xù)、實時、準確的系統(tǒng),利用MSComm控件處理串口通信就難以勝任了[10]。