智能家居系统设计与实现_第1页
智能家居系统设计与实现_第2页
智能家居系统设计与实现_第3页
智能家居系统设计与实现_第4页
智能家居系统设计与实现_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

论文关键词:智能家居嵌入式系统WindowsCEVisualC++Delphi论文摘要:本文讨论了基于WindowsCE.net5.0嵌入式操作系统,以使用IntelXScale270为CPU的ARM10嵌入式实验箱为硬件根底,以VisualStudio2005和Delphi为软件开发平台的智能家居系统的设计与实现。通过详细的系统设计过程,开发了相应的软件程序,包括嵌入式操作系统WindowsCE5.0的定制、应用程序的界面设计、程序开发和单片机系统的底层编程。本设计融合了嵌入式系统、通讯、单片机、软件开发等学科的知识。系统测试结果说明,该系统设计根本满足要求,并有一定的功能扩展空间。1绪论目前,科学技术开展迅速,借助飞速开展的网络和信息技术,人们可以足不出户地纵览全球。为了适应信息化的需求,科研机构将智能化的理念引入小区管理,并进一步引入家庭,从而产生了智能家居的概念。将通信和以太网通信技术引入智能家居的设计,恰好利用了现有的良好的通信条件,使在外的业主能及时了解家中的平安,提高业主的平安感,而且通过实时控制家电,提高了业主生活的舒适度。本文提出了基于嵌入式系统ARM10的智能控制平台的设计,功能包括了短信控制家电,传感器探测非正常环境并且通过短信告知业主,以及以太网实时视频监控等功能。2系统设计方案2.1硬件总体设计框图根据上文的功能需要,设计出由ARM10为控制核心,单片机控制的家电控制模块和传感器报警模块,并且包含GSM通信模块的智能家居系统,硬件结构框图如图2-1所示。

SHAPE

图2-1硬件设计框图2.2控制核心选择智能家居控制系统采用如图2-2所示的XSBase270作为开发平台,该平台基于Intel®高性能的PXA270处理器,支持WindowsCE和Linux等嵌入式操作系统,是针对教学和实验的多功能实验平台。PXA270处理器的最高主频可达520MHz,且该处理器被参加了WirelessMXX技术,大大的提高了多媒体处理能力,而且参加了IntelSpeedStep动态电源管理技术,在保证CPU性能的前提下,最大限度的降低设备功耗[1]。XSBase270配置32MFLASHROM,64MSDRAM,并配备了触摸屏、以太网、USB、串口、CF/MMC、PCMCIA等接口。满足了智能家居系统控制中心的硬件要求。图2-2XSBase270实验箱展开图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-5RS-232DB9头针脚定义图其中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电平转换成5VTTL/CMOS电平。每一个发送器将TTL/CMOS电平转换成TIA/EIA-232-F电平。图2-6MAX232引脚图2.3.2家电控制电路图2-7

模拟家电控制电路家用电器控制的接口电路如图2-7所示,K1~K4为继电器,分别控制四路家电的闭合和断开,Q1~Q4为继电器线圈电流驱动,电路由单片机的P1口进行控制,DD1~DD4发光二极管用于显示某路控制电路的工作情况,主要为了调试电路而设置。2.3.3传感器接口电路图2-8

传感器接口电路图烟雾、煤气泄漏、红外等这些传感器的报警信号通过光电耦合接入单片机的P2口,如图2-8所示,在传感器没有报警信号时,光电耦合芯片处于截止状态,与之相接的单片机端口为低电平;当传感器有报警,传感器输出高电平,此时光电耦合芯片导通,与之相接的单片机端口为高电平,由单片机对报警信号进行采集并做出相应处理。2.4GSM通信模块GSM通信局部采用如图2-9所示的西门子MC35GSM/GPRS无线模块作为通信工具。它支持EGSM900和GSM1800双频,支持数字、语音、短消息和,使用AT指令控制发送短消息。它采用9V直流电源供电,通过RS-232串行端口与XSBase270试验箱连接进行通信。图2-9

西门子MC352.5视频监控模块视频采集模块采用使用中星微〔Vimicro〕公司的ZC0301P芯片的摄像头,ZC0301P芯片可支持USB1.1接口,硬件最高支持VGA分辨率〔640×480〕。在VGA模式下可到达15帧/秒速率,在CIF〔352×288〕和SIF〔320×240〕模式下可到达30帧/秒速率。它通过USB接口连接到XSBase270试验箱。图2-10301P摄像头2.6总体软件设计方案根据智能家居的硬件设计方案,设计出软件的总体设计方案如图2-11所示:图2-11软件设计框图其中:、〔1〕家电控制系统和GSM网络通信各自独占一个RS-232串口。家电控制系统接XSBase270的红外串口,GSM模块接蓝牙串口。如图2-12所示。〔2〕实时视频监控通过USB摄像头捕捉图像,图像数据通过以太网发送到PC客户端进行图像复原。〔3〕以太网通信基于TCP/IP协议,测试环境为局域网,假设投入到因特网的应用,那么需要在效劳端、客户端所在的局域网连接到因特网的网关——即路由器上,要进行端口映射,才可以进行网络的连接。图2-12红外串口与蓝牙串口智能家居系统的软件基于WindowsCE5.0嵌入式操作系统。WindowsCE被设计成一种分层结构,从下而上一共分为了硬件层、OEM层、操作系统层和应用层共四个层[3]。这种层次的结构将硬件和软件,操作系统和应用软件隔离开,以便于实现系统的移植。智能家居的软件设计主要是集中在应用层。3操作系统的定制WindowsCE5.0嵌入式操作系统的定制依靠PlatformBuilder5.0完成。PlatformBuilder是微软公司设计的用于嵌入式操作平台定制与驱动程序的开发的工具。推出它的目的之一就是让用户可以更好的将嵌入式操作系统移植到特定的目标平台上。3.1BSP的安装为了让WindowsCE5.0能在实验箱上运行起来,还必须安装XSBase270的板级支持包〔BSP〕。板级支持包是介于主板和操作系统中驱动程序之间的一层,一般认为它属于操作系统的一局部,主要是对操作系统的支持,为上层的驱动程序提供访问硬件设备存放器的函数包。在PC上安装好WindowsCE.net5.0和PlatformBuilder5.0后,翻开实验箱附带光盘中的BSP文件夹,运行XSBase270_V010106.msi文件,安装XSBase270的BSP。如图3-1所示。图3-1BSP安装程序文件安装好BSP后,进入PlatformBuilder5.0中定制基于“EMDOORSYSTEMSXSBASE270:ARMV4I”的因特网应用类型的系统镜像设计[4]。如图3-2所示。图3-2

定制系统时选择BSP种类3.2添加平台特征和配置平台为了使系统在定制后能够满足根本的应用,并保证对某些设备的支持,就要向所设计的平台中添加必要的特征。〔1〕添加USBActiveSync(FileSync)组件。只有添加此组件,才能使用PC的USB接口与WindowsCE进行文件同步。这也是在应用软件调试过程中所必须的条件。(Catalog->CoreOS->WindowsCEdevices->Applications-EndUser->ActiveSync->FileSync)〔2〕添加Chinese[Simplified]Font。安装中文简体字体后,才能正常显示中文。(Catalog->CoreOS->WindowsCEdevices->International->LocaleSpecificSupport->Chinese[Simpified]->Fonts)〔3〕添加文件系统支持。(Catalog->CoreOS->WindowsCEdevices->FileSystemsandDataStore->StorageManager->FATFileSystem)〔4〕添加分区管理(Catalog->CoreOS->WindowsCEdevices->FileSystemsandDataStore->StorageManager->PartitionDriver)〔5〕添加控制面板中的存储器管理组件(Catalog->CoreOS->WindowsCEdevices->FileSystemsandDataStore->StorageManager->StorageManagerControlPanelApplet)〔6〕添加基于软件的输入系统〔软键盘等〕(Catalog->CoreOS->WindowsCEdevices->ShellandUserInterface->UserInterface->SoftwareInputPanel->Software-basedInputPanel(SIP)(Choose1ormore)->SIPforLargeScreens)〔7〕添加平台管理器〔PlatformManager〕(Catalog->PlatformManager->PlatformManager)〔8〕添加UsbActiveSync(USBFunction)(Catalog->ThirdParty->BSPs->EmdoorSystemsXSBase270:ARMV4I->DeviceDrivers->USBFunction->USBFunctionBusDrivers->PXA27xUSBFunction)完成特性的添加后,设置平台的属性。在“Platform”菜单下单击“Setting”,在Configuration下拉菜单中选择“EmdoorSystemsXSBase270:ARMV4IRelease”项,选择Locale选项卡,进行系统地理位置和环境语言支持的设置。Locales列表中,为最下端的“中文〔中国〕”项打勾。在DefaultLanguage下拉菜单里选择“中文〔中国〕”为系统的默认语言。如图3-3所示。图3-3选择操作系统默认语言在BuildOption列表中,只选择EnableEbootSpaceinMemory(IMGEBOOT=1)和WriteRun-timeImagetoFlashMemory(IMGFLASH=1)两项。如图3-4所示。图3-4程序组建选项设置单击“BuildOS”菜单下的“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注册表文件,在此文件中包含了对一些硬件的初始化的代码。在“IFBSP_NOSERIAL!”与“ENDBSP_NOSERIAL!”两句代码之间,可以看到蓝牙串口的注册表初始化代码,下面只需要添加初始化红外串口的代码:;OpentheIRSerialPort[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SerialIR]

"Irq"=dword:14

;20IRQ_STUART

"SysIntr"=dword:1b

;27SYSINTR_SFUART

"MemBase"=dword:40700000

;STUARTRegister

"MemLen"=dword:40

"DeviceArrayIndex"=dword:82

;STUARTobject

"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"="IRSerialCableonCOM3:"

"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文件。翻开刚刚建立的操作系统设计工程,选择BuildOS菜单下的MakeRun-TimeImage命令,生成新的内核文件NK.bin。3.4操作系统的生成与下载定制并组建WindowsCE后,将会生成BootLoader——EBOOT.nb0文件和NK内核——nk.bin,将它们烧写进入XSBase270实验箱。4应用软件设计4.1应用程序编写环境开发环境:MicrosoftVisualStudio2005开发语言:MicrosoftVisualC++2005软件开发包:XSBase270SDK智能家居系统的应用程序采用VisualStudio2005进行开发。VisualStudio是微软公司开发的Windows平台上的应用程序开发环境。VisualStudio可以创立Windows下的Windows应用程序和网络应用程序,也可以用来创立网络效劳、智能设备应用程序和Office插件[5]。VisualStudio2005面向.net框架〔2.0版本〕,同时可以开发跨平台的应用程序。图4-1VisualStudio20054.2智能家居人机接口设计翻开VisualStudio2005,创立一个基于MFCSmartDeviceApplication的VC++程序。如图4-2所示:图4-2新建智能家居的应用程序到选择平台步骤时选择XSBase270平台,删除默认的PocketPC2003平台。如图4-3所示。图4-3选择软件开发包支持单击“Next”按钮进入选择应用程序类型和资源语言——程序界面上采用的语言的画面。如图4-4所示,选择“Dialogbased”〔基于对话框〕类型,资源语言选择“中文〔中国〕”。其他工程保存默认的选项。图4-4选择应用程序种类保持默认的设置,一直到完成新建工程向导。进入IDE环境。集成环境的窗口分布如图4-5所示:图4-5VisualStudio2005集成环境将对话框设计成如图4-6所示:图4-6

智能家居操作界面设计表4-1智能家居应用软件界面控件配置控件类型控件名称功能按钮控件初始化GSM初始化GSM模块开始摄像翻开摄像头,开始视频捕捉停止摄像停止摄像头视频捕捉开始监听翻开ARM的9000号端口,翻开网络通信停止监听关闭端口,停止TCP通信冰箱翻开家中的冰箱设备灯光翻开家中的灯光设备微波炉翻开家中的微波炉设备空调翻开家中的空调设备关于我们查看软件作者版权声明信息退出程序关闭未关闭的线程,退出程序列表控件消息窗口用来显示用户发回的短信记录图片控件煤气煤气传感器报警信号,报警时红色,常态时绿色烟雾烟雾传感器报警信号,报警时红色,常态时绿色红外红外传感器报警信号,报警时红色,常态时绿色编辑框信息框实时显示系统运行情况4.3串口通信功能设计4.3.1串口通信协议串口通信协议采用CCESeries类实现,通过对此类的成员函数的调用,完成对串口的初始化、读写操作等,在不用串口的情况下,还可以关闭串口。4.3.2软件的实现在VisualStudio的解决方案视图里添加类CCESeries,如图4-7所示。CCESeries类的成员函数如表4-2所示。图4-7在VS2005中建立CCESeries类表4-2串口操作类CCESeries的成员函数函数作用函数名称翻开串口BOOLOpenPort(HWNDpPortOwner,UINTportNo

=1,UINTbaud=9600,UINTparity=NOPARITY,UINTdatabits=8,UINTstopbits=0);关闭串口VoidClosePort();设置串口超时BOOLSetSeriesTimeouts(COMMTIMEOUTSCommTimeOuts);读串口线程Static

DWORDWINAPIReadThreadFunc(LPVOIDlparam);写串口BOOLWritePort(LPCTSTRlpString);BOOLWritePort(char*buf,intnSize);BOOLWritePort(char*buf);关闭读线程VoidCloseReadThread();表4-3串口操作类CCESeries的成员变量变量类型变量名称作用HANDLEm_hComm已翻开的串口句柄HWNDm_hWnd此串口类所属的窗口句柄HANDLEm_hReadThread读串口线程句柄HANDLEm_hWriteThread写串口线程句柄DWORDm_dwReadThreadID读串口线程IDDWORDm_dwWriteThreadID写串口线程IDHANDLEm_hReadCloseEvent读串口线程退出事件HANDLEm_hWriteCloseEvent写串口线程退出事件翻开串口与配置串口在WindowsCE中,驱动程序分为本地设备驱动和流设备驱动两种[6]。本地设备如键盘、触摸屏等,一般在设备生产后是不会再更换的,相应的驱动这些设备的驱动程序也是必需的。而流接口设备驱动程序可以由第三方提供,支持另外添加到系统中的设备。而串口就属于流接口设备之一。流设备驱动在系统中是以三位字符串后跟一位数字表示的,对于串口而言,这三位字符是“COM”〔不包括引号〕。当引用一个流接口驱动程序时,除了三位字符后跟一位数字以外,还要紧跟一个冒号“:”〔英文半角冒号〕,冒号是必需的,是为了区别桌面Windows的设备驱动程序的命名规那么。该函数的流程图如图4-8所示:图4-8OpenPort函数流程图(1)串口的翻开所有的流驱动程序都将采用CreateFile函数翻开串口设备。在WindowsCE下,系统不支持设备的重叠I/O,所以不能在参数dwFlagsAndAttributes中传递FILE_FLAG_OVERLAPPED标志,返回的句柄要么是已翻开的串口端口的句柄,或者是INVAILID_HANDLE_VALUE。CreateFile与大多数Windows函数不一样,翻开失败时,不返回0。CreateFile函数的原型如下:HANDLECreateFile(LPCTSTRlpFileName,

//对象路径名DWORDdwDesiredAccess,

//控制模式DWORDdwShareMode,

//共享模式LPSECURITY_ATTRIBUTESlpSecurityAttributes,

//平安属性(也即销毁方式)DWORDdwCreationDisposition,

//创立的方式DWORDdwFlagsAndAttributes,

//对象属性HANDLEhTemplateFile

//一个文件模板句柄);在CCESeries类中,HANDLE类型全局变量m_hComm存储CreateFile函数翻开串口成功时的返回值,凭借此句柄可以控制翻开的串口对象;以读写的方式翻开串口。〔2〕串口的设置翻开串口后,还必须对端口配置好正确的波特率、字符长度、停止位等等。在OpenPort函数中,使用两个函数GetCommState和SetCommState来配置串口。函数原型如下:BOOLSetCommState(HANDLEhRle,LPDCBlpDCB);BOOLGetCommState(HANDLEhFile,LPDCBlpDCB);这两个函数都包含了同样的参数,即已翻开的串口的句柄和指向DCB结构的指针。DCB结构的设置如表4-4所示。表4-4

OpenPort函数中的串口DCB配置DCB定义工程设置值备注BaudRateBaud设置波特率为传入型参baud的值fBinaryTRUE二进制模式有效fParityTRUE支持奇偶校验ByteSizeDatabits设置数据位为传入型参databits,范围4~8ParityNOPARITY校验模式有效StopBitsStopbits设置停止位为传入型参stopbitsfOutxCtsFlowTRUE串口输出由端口的CTS线控制fOutxDsrFlowTRUE串口输出由端口的DSR线控制fDtrSensitivityDTR_CONTROL_ENABLE续表4-4

OpenPort函数中的串口DCB配置DCB定义工程设置值备注fDsrSensitivityFALSEfTXContinueOnXoffTRUE串口接收缓冲区已满时,且驱动程序已传送了XOFF字符,那么驱动程序停止传送字符fOutXFALSEXON/XOFF控制不用于控制串行输出fInXFALSEXON/XOFF控制不为输入串行流使用fErrorCharFALSEfNullFALSE串行驱动不忽略接收到的空字节fRtsControlRTS_CONTROL_ENABLEfAbortOnErrorFALSE串口发生错误时,并不终止串口读写〔3〕串口超时设置设置好串口驱动操作的配置后,一个必要的步骤是,设置端口的超时值。所谓超时,是指WindowsCE.net在读串口和写串口的自动返回前等待读或写操作的时间长度。在程序中,用以下两个函数控制串行超时。BOOLGetCommTimeouts(HANDLEhFile,LPCOMMTIMEOUTSlpCommTimeouts);BOOLSetCommTimeouts(HANDLEhFile,LPCOMMTIMEOUTSlpCommTimeouts);这两个函数都包含了对应的串行设备的句柄和COMMTIMEOUTS结构的指针,COMMTIMEOUTS结构定义为:typedefstruct_COMMTIMEOUTS{DWORDReadIntervalTimeout;DWORDReadTotalTimeoutMultiplier;DWORDReadTotalTimeoutConstant;DWRODWriteTotalTimeoutMultiplier;DWORDWriteTotalTimeoutConstant;}COMMTIMEOUTS;〔4〕其他的函数设置串口的输入输出缓冲区。原型如下BOOLSetupComm(HANDLEhFile,DWORDdwInQueue,DWORDdwOutQueue);设置串口检测的事件集。SetCommMask(HANDLEhFile,DWORDdwEvtMask);通过这个函数,可以使线程等待如表4-5中的常见的串口驱动程序事件。表4-5

串口驱动程序事件事件标志表达意义EV_BREAK检测到中断EV_CTSCTS更改状态EV_DSRDataSetReady信号更改状态EV_ERR串行驱动程序检测到错误EV_RKSDReceiveLineSignalDetect行更改状态EV_RXCHAR接收到一个字符EV_RXFLAG接收到一个事件字符EV_TXEMPTY传输缓冲区为空关闭串口调用CloseHandle可以关闭一个串行端口,用关闭在翻开串口时创立的那个句柄即可关闭串口了。方法如下CloseHandle(m_hComm);关闭线程函数:BOOLTerminateThread(HANDLEhThread,DWORDdwExitCode);其中,hThread为要关闭的线程的句柄。dwExitCode一般为0。假设成功关闭,那么返回一个非零值。关闭串口函数的工作流程如图4-9所示。

SHAPE

图4-9

ClosePort函数流程图串口读线程读串口ReadFile函数原形:BOOLReadFile(HANDLEhFile,

//文件的句柄LPVOIDlpBuffer,

//用于保存读入数据的一个缓冲区DWORDnNumberOfBytesToRead,

//要读入的字符数LPDWORDlpNumberOfBytesRead,//从文件中实际读入的字符数LPOVERLAPPEDlpOverlapped

//异步读取描述,在WindowsCE中为NULL);在该线程中,假设串口读完一条信息,那么发送一个系统消息到系统窗体,该消息的名称为WM_RXCHAR_ALL,是一个用户自定义消息。发送给系统窗体的附带消息包含收到的消息的内容和消息的长度。发送系统消息的API函数SendMessage的原型如下:LRESULTSendMessage〔HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMIParam〕;图4-10串口读线程流程图写串口在CCESeries类中,一共编写了三个写串口的函数,为的是方便不同情况下的调用。如要向写长度的字符串,可以采用WritePort(char*buf,intnSize)函数。写未知长度字符串时,采用WritePort(char*buf)函数,字符串的长度将在函数内部进行计算。前者提高了写串口的时间效率。这三个函数中,采用了一个共同的API函数WriteFile(),它的函数原型如下:BOOL

WriteFile(HANDLEhFile,

//文件句柄LPCVOIDlpBuffer,

//数据缓存区指针DWORDnNumberOfBytesToWrite,

//要写的字节数LPDWORDlpNumberOfBytesWritten,//用于保存实际写入字节数的存储区域的指针LPOVERLAPPEDlpOverlapped

//OVERLAPPED结构体指针,CE里设为NULL);串口类的调用在主程序中,必须调用此CCESeries类,以到达操作串口的目的。在定义智能家居的窗口行为的CSmartHomeDlg类的头文件CSmartHomeDlg.h文件中,添加CCESeries.h头文件。并且新建一个public公共型变量m_BTSerial(蓝牙串口)和m_IRSeries进行对CCESeries类的实例化。CCESeriesm_BTSerial;CCESeriesm_IRSerial;在用于CSmartHomeDlg类成员函数的定义的文件CSmartHomeDlg.cpp文件中,采用形如m_BTSerial.OpenPort(this->m_hWnd,1,9600)的方式进行串口类成员函数的调用。串口的监听在读串口线程中,读完串口的一条信息后发送名为WM_RXCHAR_ALL的系统消息给系统窗体。在窗体程序中,必须对其进行响应。在CSmartHomeDlg.cpp文件中,添加一条消息响应的声明:ON_MESSAGE(WM_RXCHAR_ALL,OnComRecvMsg)其中OnComRecvMsg为对其消息响应的函数,函数的声明如下:afx_msglongOnComRecvMsg(WPARAMwParam,LPARAMlParam);其中“afx_msg”说明该函数是一消息响应函数。4.4GSM通信模块

智能家居以GSM网络作为数据的无线传输网络,利用基于GSM网络上的短信息效劳,完成智能家居的远程平安监控和无线报警的功能。4.4.1设计根本原理PDU编码规那么自短信息技术被开发到现在,对短信息的控制方式包含了BlockMode、基于AT的TextMode基于AT指令的PDUMode。使用Block模式需要厂家驱动的支持,随着技术的开展,后两种模式将其取代。Text模式比拟简单,但不能发送中文短信息。在智能家居的软件设计中,采用的是基于PDU模式,该模式支持各个国家语言,当然也包括中文。在智能家居中,采用中文报警和中文指令。PDU数据包格式,是发送短信的一个数据单位[7]。其中的发送源号码、短消息效劳中心号码(SMSC)、时间戳等都是用压缩BCD码表示,低位在前,高位在后。在PDU模式中,可采用Bit7、Bit8和UCS2编码方式对短消息发送内容进行编码。这三种编码方式可以发送的最大字符数分别为160,140和70。其中Bit7编码发送普通ASCII字符,从0x00到0x7f,共可以表示128个字符。而短消息的报文是以8位字节传输的,所以就必须把8位码压缩成7位码。实现方法是:将第二个字符的最后一位,补充到第一个字符的前面第一位,第三个字符的后两位,补充到第二个字符的前两位,依次类推,就可得到相应的字符串。最后转换成十六进制。Bit8编码通常用于发送任何二进制数据。UCS2编码用于发送Unicode字符。它固定使用16位共两个字节来表示一个字符,共可以表示65535个字符。图4-11和图4-12分别是接收和发送短信的报文格式。图4-11接收短信的报文格式图4-12发送短消息的报文格式实例一、发送短信时的PDU码:0891683108200105F011000B913158812764F800000006C8329BFD0E01表4-6发送PDU包解析分段含义说明08SMSC地址信息的长度共8个八位字节(包括91)91SMSC地址格式(TON/NPI)用国际格式号码(在前面加‘+’)683108200105F0SMSC地址11根本参数(TP-MTI/VFP)发送,TP-VF用相对格式00消息基准值(TP-MR)00B目标地址数字个数共11位,不包括补足的‘F’91目标地址格式(TON/NPI)用国际格式号码(在前面加‘+’)683118483146F9目标地址(TP-DA)00协议标识(TP-PID)是普通GSM类型,点到点方式00用户信息编码方式(TP-DCS)7-bit编码00有效期(TP-VP)5分钟06用户信息长度(TP-UDL)实际长度6个字节C8329BFD0E01用户信息(TP-UD)“Hello!”实例二、接收短信时的PDU码0891683108200105F0840D91683158812764F8000830

30218063548006534E4E1C0021表4-7接收短消息PDU包解析分段含义说明08SMSC地址信息的长度共8个八位字节(包括91)91SMSC地址格式(TON/NPI)用国际格式号码(在前面加‘+’)683108200505F0SMSC地址84根本参数(TP-MTI/MMS/RP)接收,无更多消息,有回复地址0B回复地址数字个数共11个十进制数(不包括‘F’)91回复地址格式(TON/NPI)用国际格式号码(在前面加‘+’)683158812764F8回复地址(TP-RA)00协议标识(TP-PID)是普通GSM类型,点到点方式08用户信息编码方(TP-DCS)UCS2编码30302180635480时间戳(TP-SCTS)2003-3-1208:36:45

+8时区06用户信息长度(TP-UDL)实际长度6个字节534E4E1C0021用户信息(TP-UD)“华东!”AT指令在智能家居中,控制中心通过串口给MC35模块发送AT指令以到达控制它的目的。表4-8中是一些系统中采用的AT指令。表4-8系统采用的AT指令AT指令功能AT+CMGF=0选择短消息信息格式,等于0时为PDU格式,等于1时为文本模式,AT+CNMI=1,1,0,0,1设置为短信到达时自动提醒AT+CMGS=?发送短消息,发送成功那么返回OK字符串AT+CMGR=?读取短消息,读取成功那么返回+CMGR:0,"",[id][content]AT+CMGD=?删除短消息4.4.2软件的实现PDU编码解码短信的PDU解码和编码的功能由智能家居软件工程中的CEncode类实现。CEncode类的成员函数如表4-9所示:表4-9CEncode类的方法方法备注IntgsmString2Bytes(constchar*pSrc,unsignedchar*pDst,intnSrcLength)可打印字符串转换为字节数据如:"C8329BFD0E01"-->{0xC8,0x32,0x9B,0xFD,0x0E,0x01}int

gsmBytes2String(constunsignedchar*pSrc,char*pDst,intnSrcLength)字节数据转换为可打印字符串如:{0xC8,0x32,0x9B,0xFD,0x0E,0x01}-->"C8329BFD0E01"intgsmEncode7bit(constchar*pSrc,unsignedchar*pDst,intnSrcLength)7bit编码intgsmDecode7bit(constunsignedchar*pSrc,char*pDst,intnSrcLength)7bit解码intgsmEncode8bit(constchar*pSrc,unsignedchar*pDst,intnSrcLength)8bit编码intgsmDecode8bit(constunsignedchar*pSrc,char*pDst,intnSrcLength)8bit解码intgsmEncodeUcs2(constchar*pSrc,unsignedchar*pDst,intnSrcLength)UCS2编码intgsmDecodeUcs2(constunsignedchar*pSrc,char*pDst,intnSrcLength)UCS2解码intgsmInvertNumbers(constchar*pSrc,char*pDst,intnSrcLength)intgsmSerializeNumbers(constchar*pSrc,char*pDst,intnSrcLength)两两颠倒的字符串转换为正常顺序的字符串。IntgsmDecodePdu(constchar*pSrc,SM_PARAM*pDst)PDU解码,用于接收、阅读短消息intgsmEncodePdu(constSM_PARAM*pSrc,char*pDst)PDU编码,用于编制、发送短消息在该类中,关键的函数为gsmDecodePdu函数与gsmEncodePdu函数,它们将在智能家居中的对话框类CSmartHomeDlg中被调用。调用方法将在下文给予介绍。gsmDecodePdu函数与gsmEncodePdu函数分别用来在发短信时根据PDU标准进行编码,以及对串口收到的PDU编码进行解码。编码与解码根据在头文件中定义的短消息结构体进行取值或填充。以下是定义的关于编码方式的常量和填充短消息的数据结构。这些在接收与发送短信时是共用的。#defineGSM_7BIT

0

//7Bit编码方式#defineGSM_8BIT

4

//8Bit编码方式#defineGSM_UCS2

8

//UCS2编码方式typedefstruct{

charSCA[16];

//短消息效劳中心号码(SMSC地址)

charTPA[16];

//目标号码或回复号码(TP-DA或TP-RA)

charTP_PID;

//用户信息协议标识(TP-PID)

charTP_DCS;

//用户信息编码方式(TP-DCS)

charTP_SCTS[16];

//效劳时间戳字符串(TP_SCTS),接收时用到

charTP_UD[161];

//原始用户信息(编码前或解码后的TP-UD)

charindex;

//短消息序号,在读取时用到}SM_PARAM;CEncode类各成员函数的作用和工作流程:gsmDecodePdu()函数用于接收、阅读短消息。输入源PDU串的指针,目标PDU参数指针,并返回用户信息长度。源PDU串是可打印字符串,如“C8329BFD0E01”,目标PDU参数是字节数据,如“{0xC8,0x32,0x9B,0xFD,0x0E,0x01}”,在这个函数中,较多的采用了同在一个类中的可打印字符串转换为字节数据的函数gsmString2Bytes;在短消息效劳中心〔SMSC〕和回复号码的字符处理过程中,根据PDU串的编码标准,需要对描述SMSC的字符串段进行两两颠倒,并且去掉经颠倒后的字符串后的最后一个字符——“F”,那就采用了同在一个类中的gsmSerializeNumbers函数;经过数据别离,将PDU串中的描述短信编码位TP-DCS跟规定的数值进行比照,如表示7位码的数值为0,8位码为4,UCS2编码为8等。比照完成后,将用户信息进行对应方式的解码——如7位解码。它的工作流程如图4-13所示。

SHAPE

图4-13

CEncode类gsmDecodePdu函数工作流程gsmEncodePdu()函数用于编制、发送短消息,输入源PDU参数指针,输出目标PDU串指针,并返回目标PDU串长度。源PDU参数是字节信息,如“{0xC8,0x32,0x9B,0xFD,0x0E,0x01},目标PDU参数是字节数据,如“C8329BFD0E01”,在这个函数中,较多的采用了同在一个类中的字节数据转换为可打印字符串的函数gsmBytes2String;在短消息效劳中心〔SMSC〕和回复号码的字符处理过程中,根据PDU串的编码标准,需要对描述SMSC号码进行两两颠倒,并且在经颠倒后的字符串后加上一个字符——“F”,那就采用了同在一个类中的gsmInvertNumbers函数;根据描述短信编码的TP-DCS跟规定的数值进行比照,如表示7位码的数值为0,8位码为4,UCS2编码为8等。比照完成后,将用户信息进行对应方式的编码——如7位编码。它的工作流程如图4-14所示。

SHAPE

图4-14

CEncode类gsmEncodePdu函数工作流程gsmString2Bytes函数的作用是将可打印字符串转换为字节数据,如"C8329BFD0E01"-->{0xC8,0x32,0x9B,0xFD,0x0E,0x01},输入源字符串指针和输出的源字符串长度,输出目标数据指针,返回目标数据的长度。流程图如图4-15所示:

SHAPE

图4-15

gsmString2Bytes函数工作流程其中每两个字符串要整合成一个字节数据,如“C8”要转化为“0xC8”,故第一个字符“C”经字符转化为十六进制后要左移四位,使其成为“0xC0”,再与经过转换的低四位进行相或;然后计数器加2,源字符串和目标数据的指针往后移一个单位,继续处理下面的字符,直到计数器值的大小等于要处理的源字符串长度,那么将处理好的数据输出。字符转化为十六进制的原理是:数字字符与0字符相减,得到它们的ASCII码之差,这个差就是这个字符所要表达的数字大小,如字符‘8’就转换成了数字类型的8,用二进制表示就是1000。而A、B、C、D、E、F等字符是与‘A’的ASCII码值相减,再加上10,就可以得到其表达的十六进制数值。如‘F’减去‘A’得到5,再加10,得到15,实质上就是十六进制中F所对应的十进制数15。gsmBytes2String函数的功能与gsmString2Bytes函数相反,工作流程如图4-16所示。

SHAPE

图4-16

gsmBytes2String函数工作流程其中低四位是每个字节数据与0x0f位与得到。每四位表达的数值为0~15,而在tab数组中,从tab[0]到tab[15],对应的字符为‘0’到‘9’和‘A’到‘F’,通过此算法可以到达由数值型到字符型的转换,最后完成整条字节数据到字符串的转换。gsmEncode7bit函数的作用是7bit编码。输入源字符串指针和源字符串的长度,输出目标字符串指针和目标编码串长度。工作流程图如图4-17所示。

SHAPE

图4-17

gsmEncode7bit函数流程gsmDecode7bit函数用于7位码的解码,输入源编码串指针和源编码串长度,输出目标字符串指针和目标字符串的长度。流程图如图4-8所示:

SHAPE

图4-18

gsmDecode7bit函数工作流程gsmEncode8bit函数用于8位码编码,因为计算机采用的也是8位码,源编码串和目标字符串是一致的,所以其编码工作用memcpy函数简单的复制即可完成。gsmDecode8bit函数用于8位码解码,与gsmEncode8bit一样只需要采用简单的复制即可,区别在于在目标字符串末尾加一个“\0”结束字符。gsmEncodeUcs2函数用于UCS2编码,根据PDU编码规那么,UCS2码采用的是16位双字节的编码方式。工作方式如图4-19所示。

SHAPE

图4-19

gsmEncodeUsc2函数工作流程gsmDecodeUsc2函数用于UCS2码的解码。它的工作流程如图4-20所示:

SHAPE

图4-20

gsmDecodeUcs2函数工作流程gsmEncodeUcs2函数和gsmDecodeUcs2函数分别用了作用相反的两个API函数——MultiByteToWideChar和WideCharToMultiByte函数。它们的作用分别为将短字符〔用8位数据表示的字符〕转换为宽字符〔16位数据表示的字符,如Unicode编码〕,和将宽字符转换为短字符。

SHAPE

图4-21gsmInvertNumbers函数工作流程收发短信〔1〕监听新短信GSM模块连接在串口上,对短信的监听实质上是对串口的监听。具体的新短消息的监听流程如图4-22所示:图4-22

新消息监听流程其中:1〕AT+CMGF=0——设置短消息内容控制模式为PDU模式2〕AT+CNMI=1,1,0,1,1——设置短消息到达自动提醒功能。3〕AT+CMGR=[index],其中index是短消息在SIM卡中的地址。如果读取成功,既对应的地址中存在信息,那么返回CMGR:0,"",[id][content],当人工选择读信息的时候,也可以采用此语法,只要将index的值改成短消息在SIM卡中的地址即可。假设短消息不存在,那么返回ERROR。(2)发送短消息在CSmartHomeDlg类中,必须对短信编码解码类CEncode和SM_PARAM结构体进行实例化。CEncodem_encode;SM_PARAMparam;在填充好机构体以后,用下面一句nPduLength=m_encode.gsmEncodePdu(¶m,pdu);对短消息结构体进行PDU编码,编码结果放入pdu数组中,PDU长度返回到nPduLength。流程图如图4-23所示:

SHAPE

图4-23

发送短信流程4.5图象采集模块中星微摄像头采用了中星微301PLUS快速主控芯片。该芯片是一款高性能图像压缩芯片,输出MIPEG视频流数据。MIPEG(MotionJPEG)主要是基于静态视频压缩开展起来的技术,特点是根本不考虑视频流中不同帧之间的变化,只单独对某一帧进行压缩,通常可到达6:1的压缩率。它的误差稳定性非常好,可以获取清晰度很高的视频图像,而且还可以灵活设置各路视频清晰度,压缩帧数。4.5.1摄像头驱动程序该摄像头的官方提供了其在WindowsCE环境下的驱动程序zc030x.dll和在VC下对其编程的lib库文件zc030xlib.lib。只要在智能家居的工程属性中,将其提供的lib库文件导入即可使用它提供的一些函数。步骤:Project菜单->SmartHomeProperties,选择左边列表ConfigurationProperties->Linker->Input导入lib库文件操作的截图如图4-24所示:图4-24在VS2005中添加lib库文件图像采集模块用到的主要函数有:capInitCamera()用来初始化视频设备,并获取当前可用的视频设备数目;capSetVideoFormat()设置视频格式和分辨率。本系统使用的视频格式为RGB24,分辨率为320×240像素;capGetPicture()获取摄像头最近捕捉的一幅位图,存入指定的缓存中capCloseCamera()关闭视频设备4.5.2视频捕捉和视频信息传送摄像头工作流程经过了初始化摄像头和捕捉视频和关闭摄像头等流程,详细的流程如图4-25所示:

SHAPE

图4-25摄像头的工作流程其中设置视频格式、捕捉图象和发送图象等步骤位于线程CaptureThreadProc中,该线程在点击智能家居系统应用程序界面上的“翻开摄像头”按钮后创立,在点击“关闭摄像头”后关闭。视频数据的分包发送在视频监控功能中是关键的一个步骤。在这个步骤里,系统将摄像头采集到的视频数据存储在一个临时的数组中,通过对这个临时数组的数据分割,完成数据的分包存储。在系统中,每个视频数据包的大小为1440字节。在系统的运行测试中,通过断点调试的方式,知道摄像头通过capGetPicture()函数获取到的一帧图象信息的大小大概在4000字节到5000字节之间,所以连续发送四个到五个数据包即可将一幅画面的数据发送到客户端。4.6以太网通信模块在智能家居中,嵌入式平台充当效劳器的角色,相应的PC视频监控端充当客户端的角色。效劳器端与客户端之间的通信基于TCP/IP协议。4.6.1TCP/IP协议Internet上使用的一个关键的底层协议是网际协议,通常称IP协议。通过这个共同遵守的协议,可以使Internet成为可以连接不同层次的计算机网络。IP协议是TCP/IP协议的心脏,是计算机网络层中最重要的协议,IP协议用来帮助数据找到通往目的计算机的路径[8]。IP层接收从网络接口层发送过来的数据包,并把该数据包发送到更高层——TCP层;相反的,IP层也将从TCP层发送过来的数据包发送到接口层——网络层的更低层。而IP数据包是不可靠的,因为IP协议并没有做任何事情来确认数据包的顺序和它的完整性。IP数据包中包含了发送数据包的计算机IP地址〔源地址〕和接收数据包的计算机IP地址〔目标地址〕。TCP协议主要是对IP数据包中被封装好的TCP数据包进行排序和错误检查。TCP数据包包括序号与确认,根据这些信息可以将未经过正确排序的数据包进行排序,损坏的包按要求进行重传。处理完以后将数据发送给更高层的应用程序。应用程序轮流将信息发给TCP层,TCP层将数据发送给IP层,最后通过设备驱动和物理介质〔网线〕等发送到目标计算机。如图4-26所示。应用层协议〔HTTP、FTP等〕传输控制协议TCP网间协议IP以太网驱动程序硬件以太网接口图4-26IP层与以太网驱动器以及TCP层、应用程序层通信4.6.2软件实现所有的TCP通信都发生在两个端点或两个套接字〔Socket〕之间[8]。每个Socket都有一个端口号与一个IP地址。Socket可以被看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。在智能家居系统的效劳端,TCP编程的流程如下:〔1〕TCP效劳器声明一SOCKET类型的全局变量m_Socket;〔2〕通过bind函数绑定本地地址;〔3〕用Listen函数进行监听客户端连接〔4〕当有客户端请求时,套接字采用Accept函数接受客户端请求〔5〕效劳端新添加一个单独的套接字与客户端进行通讯。假设用流程图表示,如图4-27所示。基于以上流程和原理,在VS2005中新添加两个类——CTCPServer_CE和CTCPCustom_CE。其中CTCPServer_CE类用于开启与关闭TCP效劳,以及翻开监听套接字事件的线程。CTCPCustom_CE用于翻开套接字和关闭套接字,以及向客户端发送数据等。

SHAPE

图4-27TCP效劳工作流程图在初始化阶段,调用WSAStartup()函数以在应用程序初始化WindowsSocketDLL,调用成功后,应用程序即可采用WindowsSocket中的其他有关API函数。在此之后,在程序中建立一个用于监听网络的Socket,并定义其采用的通讯协议——TCP协议。完成这一操作的函数是socket()。它的原型是:SOCKETPASCALFARsocket(intaf,inttype,intprotocol)其中第二个形参用于指定套接字的通信类型,当type为SOCK_STREAM时,为遵从TCP协议的通信,假设要遵从UDP协议,应设置为SOCK_DGRAM;在智能家居中,采用前者。根据流程,接下来要绑定一个IP地址和端口,这个地址和端口是客户端将要连接的目标,通过调用bind()函数可以完成这一操作,以下是bind()函数的原型。intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);其中s为被操作的Socket对象,name是ARM端的IP地址。namelen为IP地址的长度。在监听网络局部,ARM效劳器端建立一个监听队列来接受客户端的连接请求。listen()函数可以完成这一操作。intPASCALFARlisten(SOCKETs,intbacklog);s为要操作的Socket;backlog为最大连接数,在系统中设置为8。在客户端发出连接请求时,ARM客户端调用accept〔〕函数,从而完成完整的连接操作。在智能家居系统的软件设计中,将监听以太网通过一个线程来实现。

SHAPE

图4-28TCP读线程工作流程4.7PC端视频监控模块该模块采用Delphi7企业版编写,它是由Borland公司推出的全新的可视化编程环境,是快速、方便的桌面Windows应用程序开发的工具之一[9]。它综合了Windows的图形界面的许多特性和设计思想,采用了面向对象编程语言。在Delphi中,提供了包含TCP通信控件在内的许多控件使开发人员能够快速构建和实现应用软件系统。基于这一特点,PC客户端采用Delphi编写。PC端处于TCP/IP网络中的客户端,它的网络通信依靠Delphi中的TCPClient控件完成。TCPClient控件需要完成的操作是:1)

翻开一个通信信道,连接到智能家居ARM效劳器端的特定端口。2)

向效劳器发送效劳请求报文,等待并接收应答,如此反复3)

请求结束后关闭通信通道并终止通讯。按照以下步骤建立好PC端视频监控程序的界面,如图4-29所示,图4-30所示的是客户端工作流程。图4-29

PC端视频监控程序界面A、翻开Delphi7集成环境,系统自动新建一个工程。B、在窗体中拖入Standard控件工具箱的button控件三个,label控件2个,Edit控件两个,Groupbox一个,Additional工具箱里的Image控件一个,Internet工具箱里的TCPClient控件一个。C、设置各控件属性,如表4-10所示。表4-10

PC端视频监控软件控件设置情况控件种类名称属性设置窗体主窗体caption:“视频监控PC端”按钮设置caption:“设置”,name:“BtnSetting”开启视频caption:“开启视频”,name:“BtnOpenCamera”关闭视频caption:“关闭视频”,name:“BtnCloseCamera”标签对方IP:caption:“对方IP:”,name:“Label1”对方端口:caption:“对方端口:”,name:“Label2”编辑框IPname:“txtIP”,text:“6”端口name:“txtPort”,text:“9000”TCPClientHost:“6”,Port:“9000”图像框name:“VideoFrame”,height:“240”,width:“320”其中,Image控件用于显示视频,它一次只显示一帧静态的图象,因为人眼有视觉暂留效应,图象的更新也比拟快,所以人眼看起来是动态的图象。界面中的文本框控件是为了能在对方的IP地址和端口号改变的情况下,通过输入不同的IP号和端口号,再点击设置按钮,从而改变TCPClient控件的Host属性〔用于指定对方IP〕和Port属性〔用于指定对方端口〕,再翻开以太网通信通道,向ARM效劳端进行连接请求。

SHAPE

图4-30PC客户端工作流程在程序设计中采用了Delphi中的TJpegImage对象和TMemory对象。TMemory对象用于存储TCP层发送给应用层的数据包包含的数据,在接收完数据包后,程序创立TJpegImage类型对象jpg,jpg通过LoadFromStream()方法装载缓冲区中的数据,最后在窗体上的VideoFrame图片控件上显示出来。4.8家电控制及传感器模块在该模块中,家电控制以及传感器报警模块依托89C51单片机丰富的I/O口完成。传感器的报警状态通过RS232串口向ARM发送相应的字符串,由ARM端的应用程序进行解析。类似的,ARM端通过串口发送指定格式的字符串到单片机串口,串口翻开相应的LED,以表示对应的家电的电源的翻开。4.8.1单片机串口的配置在智能家居系统的家电控制板中,单片机的串行口通信采用10位为一帧的工作方式1。这10位中,共包括1个起始位、8位数据位和1个停止位[10]。起始位D0D1D2D3D4D5D6D7停止位图4-31

单片机串行工作方式1的帧格式根据串口协议,串口工作方式1中的数据发送方法是在往发送存放器〔SBUF〕中发送一条8位的数据后,由硬件自动地在它的前面参加起始位和在后面加上一个停止位,构成完整的帧格式。数据从串口的TXD输出,输出完一帧数据后,TXD输出线保持高电平,并且SCON存放器的TI位被置位为1,通知CPU可以发送下一帧数据。接收数据时,SCON存放器的REN位被设为1,串口采样RXD针脚,当RXD从高电平向低电平状态跳变时,单片机识别出起始位到达,在移位脉冲的控制下,读完数据位并且将其存入接收存放器中,直到停止位到达,置位RI中断标志位,单片机的CPU即可将数据取走。在智能家居系统中,规定单片机的波特率为9600bps,这是为了与在应用软件中的串口设置相对应,使其能够与ARM正常通信。波特率的大小由单片机的定时〔计数〕器T1的计数溢出率决定。在单片机扩展板中,采用的是11.0592MHz的晶振,计算定时器的计数初值:

〔4-1〕其中smod=0,使波特率不倍增,PCON=00H。对于定时器1,选择方式2作为其工作方式。这种工作方式将16位的计数器T1分成了两局部,其中高8位TH1作为预置存放器,在初始化时,将计数初值分别存入TH1和TL1中,即两者内容相同,当计数溢出时,预置存放器TH1将计数初值直接给TL1加载,这样就防止了在程序中反复地存储计数初值,进一步的提高了定时的精度,保证了串行接口的波特率的稳定,同时也是保证了串口通信的稳定性。4.8.2串口通信的自定义约定为了便于单片机与ARM之间的通讯信息的解析,特别定义了以下自定义的信息交流的格式约定。A传感器报警字符串,如图4-32所示。#$#1报头传感器编号图4-32传感器报警字符串格式该字符串为传感器报警时单片机向ARM串口发送的字符串,共四位,不同传感器报警时,发送字符串的区别在于第四位。在家电控制板上,有三个按钮模拟三个传感器,即传感器编号为1、2、3。如传感器2报警时,发送“#$#2”字符串到ARM。B家电控制字符串,如图4-33所示。%1111报头家电1标志位家电2标志位家电3标志位家电4标志位图4-33家电控制字符串格式该控制字符串共五位,包含报头‘%’字符和四位分别表示不同家电的标志位。要控制家电的电源开和关,只要在对应的位上进行置位〔设为1〕或重置〔设为0〕即可。如要启动家电1和4,保持2和3的关闭状态,那么向单片机发送“%1001”字符串即可。4.8.3单片机程序流程单片机的程序采用C语言编写。单片机的工作主流程如图4-所示。其中单片机的初始化包括对定时方式控制存放器的初始化、对定时计数器1的初始化,串口工作方式的初始化以及波特率的设置等。在传感器状态字符串信息的发送过程中,采用逐字发送的方式发送字符串。这是因为串口工作方式1的约束,每次发送的数据为8位,即一个字节,亦即一个字符。当每次发送完一个字符,发送中断标志位TI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论