当前位置: 首页 > 范文大全 > 公文范文 >

基于串行通信的智能家居上位机设计

时间:2022-03-19 09:30:40  浏览次数:

摘 要:在智能家居系统设计中,串行通信是实现上位机与下端模块通信的最主要的手段。为了提高上位机与下端模块的通信效率,在上位机设计时通过使用Windows的MSComm控件和自编制的串口接收发送动态控件的比较,发现利用MSComm控件虽然可以方便快捷地编制出上位机程序,但其通信效率偏低,误帧和失帧率较高,只适用于单模块测试。对于多模块实时通信系统,采用其他控件或自编制收发程序更为有效。

关键词:上位机; 单片机; 智能家居系统; 协议; 串行通信; 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 引 言

上位机设计是智能家居系统的一个重要组成部分,担负着管理、控制、维护和用户界面操作的重任,高效可靠的上位机设计是整个系统正常运作的重要保障。上位机与系统的通信实际上是与下端单片机的通信[1]。单片机或单片机系统是智能家居控制的核心,当计算机作为单片系统的一个角色时,通常被称为“工控机”或“上位机”,各独立的单片机是系统中实现功能的一个模块,所以有时也称单片机为模块。

计算机与单片机是通过串口来实现通信的,本文着重讨论计算机与单片机的串口通信的实现方法和MSComm控件技术。

1 上位机在智能家居系统的角色

首先,必须认识计算机在智能家居系统的作用,可以概括为以下几个方面:

1.1 通信测试工具

传统的单片机系统的通信测试通过示波器来监测,既不直观又容易丢失信息。将计算机加入到系统中,可以实时监测到线路中的信息,并以数字化呈现,使各个单片机间的通信得到检验,及时解决系统存在的问题。所以计算机在加速系统的开发和保证系统的运行质量的作用就不言而喻了。

1.2 系统维护

一个单片机系统往往需要对系统中各个不同功能的模块(单片机)进行参数的设置,以适应不同的运行环境,虽然可以通过各模块的控制面板来调整,但操作通常比较麻烦,非专业人员不易掌握。同时对于一些需要定义其地理位置的参数难以实现,不够直观。计算机加入到系统中,不但可以解决操作上的问题,同时还可以读取各模块的参数,以便于调整[2]。

1.3 单片机

计算机可以作为单片机系统的一个模块,完成相应的功能。计算机应答系统的请求、处理系统中的信息,一方面将信息呈现给用户,另一方面计算机程序通过自动计算或用户的输入,将信息反馈到系统中,参与系统的控制。

1.4 主控机

在单片机系统中,往往存在一个主控机或主控模块,负责对整个系统的统筹和设置。单片机系统通常是通过各功能模块的输入和响应来实现其功能的,因此必须有一个负责收集输入任务并指定响应模块的主控模块。计算机系统中既可以是一个普通的模块,又可以是负责总体协调的主控器。

2 通信协议

一个单片机系统是由硬件系统和软件系统构成的。硬件是实现功能的前提,而系统功能则是通过软件来实现的,为了保证各个模块通信,实现系统信息交流,必须制订系统的通信协议。

从物理上来说,系统各模块是以半双工的模式来通信的,下文提及的智能照明系统下端模块就是以半双工的RS 485总路线为通信架构的。而计算机的RS 232串口是以全双工的模式来实现通信的,因此,计算机要通过串口参与到单片机系统中必须增加一个RS 232和RS 485总线转换的模块[3]。

从逻辑上讲,要实现各模块之间的通信,就必须在模块间约定一个共同遵守的通信协议。单片机以位(b)为基本单位,传输时以8位1字节(B)来传输,单片机以毫秒间距发送若干个字节为一个数据包,也称为一帧,帧之间又规定若干毫秒的间隙。通过计算机程序可以捕获线路中每一帧信息。

下面以智能照明系统为例,讲述单片机系统的通信协议。

本协议采用异步串行通信方式,字节帧格式:1个起始位+8个数据位+1个停止位,无校验位。

帧格式如下[4]:

1帧=帧头(F4H F5H)+数据包+帧尾(F4H FBH) <255 B

数据包=有效字节数(1 B)+传输层数据+校验和(1 B)<251 B

帧数据的发送、接收过程中前后两字节数据传送延时不得超过0.5 s。

各模块分配两个字节的地址码,第一字节代表模块类型,第二字节代表模块在系统中分配的顺序。各模块获取总线上的帧后,对自己的地址帧响应,其他的帧抛掉。

以下是本协议中的关于“灯开停控制”的协议:

描述:该信息是输出子模块的各路灯的开或关控制。

构成:该信息发送时由信息头和信息内容构成,返回时由信息头构成。

主控器或PC机发给输出模块时:

MessageType53

MessageSubType0/2

Result0

信息内容:

第一字节,灯号字节10:不相关,1:相关,bit7~bit0分别对应本模块8~1号灯

第二字节,灯号字节10:不相关,1:相关,bit6~bit0分别对应本模块15~9号灯

第三字节,开度值0:关,1~63亮度值:开,128:突关,255:突关

第四字节,变光时间0~255

输出模块返回给主控器时,信息头定义如下:

MessageType53

MessageSubType0/2

ResultDependent on operation(1 or 0)

系统的通信按照规定的各条协议来执行。

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控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。

3.2 MSComm控件的设置

3.2.1 MSComm控件的属性

MSComm控件有很多重要的属性,正确设置其属性是程序进行正常通信的保证,下面介绍几个必须熟悉的属性[7] 。

CommPort:设置并返回通讯端口号。

Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。

PortOpen:设置并返回通讯端口的状态,也可以打开和关闭端口。

Input:从接收缓冲区返回和删除字符。

InputMode:接收模式,取0值时,接收文本数据;取1时,接收二进制数据。

Output:向传输缓冲区写一个字符串。

Rthrehold:响应模式,取整数。当接收字符后,若Rthrehold属性设置为 0,则不产生OnComm 事件;若设置为1,则接收缓冲区收到每一个字符都会使 MSComm控件产生OnComm事件。

Sthreshold:发送模式,设置0(缺省值),数据传输事件不会产生OnComm事件;设置为1,当传输缓冲区完全空时,MSComm控件产生OnComm 事件。如果在传输缓冲区中的字符数小于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) 事件驱动方式

事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者Carrier Detect(CD)或Request To Send(RTS)线上一个字符到达或一个变化发生时。在这些情况下,可以利用MSComm控件的OnComm事件捕获并处理这些通讯事件。OnComm事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅CommEvent属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个MSComm控件。

(2) 查询方式

查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为惟一等待接收的字符是调制解调器的“确定”响应。

3.3 计算机信息发送和接收的实现

下面以智能照明系统中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控件对于一问一答式的通信,效果还是可以的,所以用于单模块的通信测试问题不大。但是,如果计算机作为单片系统的一个角色,要实时捕获总线上的信息并响应,存在失帧和误帧的问题[9],如果系统要求不高,还可以对付,而象智能照明这样要求信息持续、实时、准确的系统,利用MSComm控件处理串口通信就难以胜任了[10]。

在智能照明系统中,采用了自编制的动态库Transdata.dll程序,作为处理串口通信的接口,误帧率和失帧率较低,能满足产品化的要求。

Transdata.dll使用说明:

(1) 初始化串口并处于通讯状态<函数>

Init OpenCom(byval m str as string,byval nbaud as Integer) as Boolean

参数说明:m str为串口名称,如“com1”“com2”等;nbaud为波特率,可为1 200,2 400,4 800,9 600等;返回值为Boolean,若为true则成功,否则失败false。

(2) 关闭串口结束通讯<过程>

CloseCom()

(3) 发送通讯数据<过程>

SendData(n str as byte,byval ncount as Integer)

参数说明:n str 为要发送byte的数组的第一个字节;如要发dim ndata(11) as byte这个数组,只需用ndata(0)作为n str参数即可;ncount为要发送的字节数。

(4) 接收返回的数据<函数>

GetData(byval m str as string)as string

参数说明:m str 必须为已有能容纳所要接收字串的长度空间返回接收到的字串,各个字节以“\\t”隔开。

5 结 语

利用MSComm控件虽然可以方便快捷编制出的 上位机程序,但其通信效率偏低,误帧和失帧率较高,只适用于单模块测试。对于多模块实时通信系统,宜采用其他控件或自编制更有效的收发程序。

参考文献

[1]钱卫东.楼宇智能化技术概论[ M] .北京:电子工业出版社,2006.

[2]江永池.智能照明控制系统上位机软件Ihome技术说明书[ M] .顺德:广东科龙集团华傲电子公司,2002.

[3]侯艳.用VS2005实现AT89C51单片机与PC的串行通信[ J] .现代计算机,2009(2):198-200.

[4]陈坚波.灯光控制通讯协议1.2.6[ S] .顺德:广东科龙集团华傲电子公司,2001.

[5]王贺艳.基于VB的PLC与PC机串行通信的实现[ J] .福建电脑,2009(2):150-154.

[6]北京博彦科技发展有限公司.Visual Basic开发教程[ M] .北京:清华大学出版社,2006.

[7] 佚名.单片机与计算机RS 232串行通信开发实例[ EB/OL] .[ 2009-07-15] .http://down.csdn.net/source/1316480.

[8]李墨.单片机与PC机的串行通信[ J] .中国新技术新产品,2009(13):29.

[9]邵贝贝.单片机嵌入式应用的在线开发方法[ M] .北京:清华大学出版社,2004.

[10]李双科,吴记群.Windows环境下计算机与PLC串行通信的实现[ J] .兰州工业高等专科学校学报,2005,12(2):30-33.

推荐访问: 上位 智能家居 通信 设计