当前位置:主页 > 新闻中心 > 行业新闻 >

智能家居系统中的上位机设计

时间:2021-04-06 11:15   tags: 行业新闻  

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


 

上位机设计


 


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


 


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


 


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


 


  1.1 通讯测试工具


 


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


 


  1.2 系统维护


 


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


 


  1.3 单片机


 


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


 


  1.4 主控机


 


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


 


  2 通讯协议


 


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


 


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


 


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


 


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


 


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


 


  帧格局如下:


 


  l帧=帧头(F4H F5H)+数据包+帧尾(F4HFBH)<255B


 


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


 


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


 


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


 


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


 


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


 


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


 


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


 


  


 

 


 

  系统的通讯按照划定的各条协议来执行。


 


  3 计算机通讯的实现


 


  计算机硬件上通过RS 232与RS 485接口转换与下端模块进行通讯。而软件的实现有多种方法,下面主要先容在VB 6.0通过MSComm控件来实现通讯的方法。


 


  3.1 将MSComm控件引入到VB平台


 


  MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通信功能。MSComm控件在串口编程时非常利便,程序员不必去花时间去了解较为复杂的API函数,而且在VC,VB,Delphi等语言中均可使用。


 


  MSComm是Mierosoft公司提供的简化Windows下串行通讯编程的AcveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。详细的来说,它提供了两种处理通讯题目的方法:一是事件驱动(Eventdriyen)方法,一是查询法。


 


  3.2 MSComm控件的设置


 


  3.2.1 MSComm控件的属性


 


  MSComm控件有良多重要的属性,准确设置其属性是程序进行正常通讯的保证,下面先容几个必需认识的属性。


 


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


 


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


 


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


 


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


 


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


 


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


 


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


 


  Sthreshold:发送模式,设置O(缺省值),数据传输事件不会产生OnComm事件;设置为1,当传输缓冲区完全空时,MSComm控件产生OnComm事件。假如在传输缓冲区中的字符数小于value,CommEvent属性设置为comEvSend,并产生OnComm事件。


 


  Handshake:通讯握手模式,取值为O时,无握手;取值为1时,表示XOn/Xoff握手;取值为2时,表示Request-to\-send/clear-to-send握手;取值为3时,表示eqLlest-to-send&clear-to-send握手皆可。


 


  3.2.2 MSComm控件两种处理通信的方式


 


  MSComm控件提供下列两种处理通信的方式:事件驱动方式和查询方式。


 


  (1)事件驱动方式


 


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


 


  (2)查询方式


 


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


 


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


 


  下面以智能照明系统中PC机与主控器的通讯,说明计算机与单片机通讯的实现方法。以下是实现的主要子程序。


 


  页面装载程序:


 


  


 

 


 


  通讯建立后,计算机就可以与下端单片机通过设定的协议进行通讯,可以测试下端模块的响应。


 


  4 MSComm控件的题目和解决办法


 


  在实际应用中,MSComm控件对于一问一答式的通讯,效果仍是可以的,所以用于单模块的通讯测试题目不大。但是,假如计算机作为单片系统的一个角色,要实时捕捉总线上的信息并响应,存在失帧和误帧的题目,假如系统要求不高,还可以对付,而象智能照明这样要求信息持续、实时、正确的系统,利用MSComm控件处理串口通讯就难以胜任了。


 


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


 


  Transdata.dll使用说明:


 


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


 


  Init_OpenCom(byval m_str as string,byval nbaud as Integer)as Boolean


 


  参数说明:m_str为串口名称,如“coml”“com2”等;nbaud为波特率,可为1200,2400,4800,9600等;返回值为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参数即可;nc-ount为要发送的字节数。


 


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


 


  GetData(byval m_str as string)as string


 


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


 


  5 结语


 


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