摘自:http://www.csmayi.cn/yjzc/hyzc/201103/127410.html
论文关键词:智能家居 嵌入式系统 Windows CE Visual C++ Delphi
论文摘要:本文了基于Windows CE.net 5.0嵌入式操作系统,以使用Intel XScale270为CPU的ARM10嵌入式实验箱为硬件基础,以Visual Studio 2005和Delphi为软件开发平台的智能家居系统的设计与。详细的系统设计过程,开发了的软件程序,包括嵌入式操作系统Windows CE 5.0的定制、应用程序的界面设计、程序开发和单片机系统的底层编程。本设计融合了嵌入式系统、通讯、单片机、软件开发等学科的知识。系统测试结果表明,该系统设计要求,并有的功能扩展空间。
1 绪论
,科学技术发展迅速,借助飞速发展的网络和信息技术,人们可以足不出户地纵览全球。信息化的需求,科研机构将智能化的理念引入小区管理,并引入家庭,从而产生了智能家居的概念。将手机通信和以太网通信技术引入智能家居的设计,恰好了现的通信条件,使在外的业主能家中的安全,业主的安全感,而且手机实时控制家电,了业主生活的舒适度。
本文了基于嵌入式系统ARM10的智能控制平台的设计,功能包括了短信控制家电,传感器探测非环境并且手机短信告知业主,以太网实时视频监控等功能。
2 系统设计方案
2.1 硬件总体设计框图
上文的功能需要,设计出由ARM10为控制核心,单片机控制的家电控制模块和传感器报警模块,并且包含GSM通信模块的智能家居系统,硬件结构框图如图2-1所示。
SHAPE \* MERGEFORMAT
图2-1 硬件设计框图
2.2 控制核心选择
智能家居控制系统采用如图2-2所示的XSBase270开发平台,该平台基于Intel®高性能的PXA270器,支持Windows CE和Linux等嵌入式操作系统,是教学和实验的多功能实验平台。
PXA270器的最高主频可达520MHz,且该器被加入了Wireless MXX技术,大大的了多媒体能力,而且加入了Intel SpeedStep电源管理技术,在CPU性能的前提下,最大限度的降低设备功耗[1]。
XSBase270配置32M FLASH ROM,64M SDRAM,并配备了触摸屏、以太网、USB、串口、CF/MMC、PCMCIA等接口。了智能家居系统控制中心的硬件要求。
图2-2 XSBase270实验箱展开图
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-5 RS-232 DB9头针脚定义图
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电平转换成5V TTL/CMOS电平。每发送器将TTL/CMOS电平转换成TIA/EIA-232-F电平。
图2-6 MAX232引脚图
2.3.2 家电控制电路
图2-7 模拟家电控制电路
家用电器控制的接口电路如图2-7 所示,K1~K4 为继电器,分别控制四路家电的闭合和断开,Q1~Q4 为继电器线圈电流驱动,电路由单片机的P1口控制,DD1~DD4 发光二极管用于显示某路控制电路的工作情况,主要调试电路而设置。
2.3.3 传感器接口电路
图2-8 传感器接口电路图
烟雾、煤气泄漏、红外等传感器的报警信号光电耦合接入单片机的P2 口,如图2-8 所示,在传感器报警信号时,光电耦合芯片截止状态,与之相接的单片机端口为低电平;当传感器有报警,传感器输出高电平,此时光电耦合芯片导通,与之相接的单片机端口为高电平,由单片机对报警信号采集并。
2.4 GSM通信模块
GSM通信采用如图
2-9所示的西门子MC35 GSM/GPRS无线模块 通信工具。它支持EGSM900和GSM1800双频,支持数字、语音、短消息和传真,使用AT指令控制发送短消息。它采用9V直流电源供电, RS-232串行端口与XSBase270试验箱连接 通信。
图2-9 西门子MC35
2.5 视频监控模块
视频采集模块采用使用中星微(Vimicro)公司的ZC0301P芯片的摄像头, ZC0301P芯片可支持USB 1.1接口,硬件最高支持VGA分辨率(640×480)。在VGA模式下可15帧/秒速率,在CIF(352×288)和 SIF(320×240)模式下可30帧/秒速率。它USB接口连接到XSBase270试验箱。
图2-10 301P摄像头
2.6总体软件设计方案
智能家居的硬件设计方案,设计出软件的总体设计方案如图2-11所示:
图2-11 软件设计框图
:、
(1)家电控制系统和GSM网络通信各自独占RS-232串口。家电控制系统接XSBase270的红外串口,GSM模块接蓝牙串口。如图2-12所示。
(2)实时视频监控USB摄像头捕捉图像,图像数据以太网发送到PC客户端图像还原。
(3)以太网通信基于TCP/IP协议,测试环境为局域网,若投入到因特网的应用,则需要在服务端、客户端所在的局域网连接到因特网的网关——即路由器上,要端口映射,才可以网络的连接。
图2-12 红外串口与蓝牙串口
智能家居系统的软件基于Windows CE 5.0嵌入式操作系统。Windows CE被设计成分层结构,从下而上一共分硬件层、OEM层、操作系统层和应用层共四个层[3]。层次的结构将硬件和软件,操作系统和应用软件隔离开,以便于系统的移植。智能家居的软件设计主要是在应用层。
3 操作系统的定制
Windows CE 5.0嵌入式操作系统的定制Platform Builder5.0。Platform Builder是微软公司设计的用于嵌入式操作平台定制与驱动程序的开发的工具。推出它的目的让用户可以的将嵌入式操作系统移植到特定的平台上。
3.1 BSP的安装
让Windows CE 5.0能在实验箱上运行起来,还安装XSBase270的板级支持包(BSP)。板级支持包是介于主板和操作系统中驱动程序之间的一层,它属于操作系统的一,主要是对操作系统的支持,为上层的驱动程序访问硬件设备寄存器的函数包。
在PC上安装好Windows CE.net5.0和Platform Builder5.0后,打开实验箱附带光盘中的BSP文件夹,运行XSBase270_V010106.msi文件,安装XSBase270的BSP。如图3-1所示。
图3-1 BSP安装程序文件
安装好BSP后,Platform Builder5.0中定制基于“EMDOOR SYSTEMS XSBASE270:ARMV4I”的因特网应用类型的系统镜像设计[4]。如图3-2所示。
图3-2 定制系统时选择BSP种类
3.2 添加平台特征和配置平台
使系统在定制后能够的应用,并对某些设备的支持,就要向所设计的平台中添加必要的特征。
(1)添加USB Active Sync(File Sync)组件。添加此组件,才能使用PC的USB接口与Windows CE文件同步。这在应用软件调试过程中所的条件。
(Catalog->Core OS->Windows CE devices->Applications-End User->ActiveSync->File Sync)
(2)添加Chinese[Simplified] Font。安装中文简体字体后,才能显示中文。
(Catalog->Core OS->Windows CE devices->International->Locale Specific Support->Chinese[Simpified]->Fonts)
(3)添加文件系统支持。
(Catalog -> Core OS -> Windows CE devices -> File Systems and Data Store -> Storage Manager -> FAT File System)
(4)添加分区管理
(Catalog -> Core OS -> Windows CE devices -> File Systems and Data Store -> Storage Manager ->Partition Driver)
(5)添加控制面板中的存储器管理组件
(Catalog -> Core OS -> Windows CE devices -> File Systems and Data Store -> Storage Manager -> Storage Manager Control Panel Applet)
(6)添加基于软件的输入系统(软键盘等)
( Catalog -> Core OS -> Windows CE devices -> Shell and User Interface -> User Interface -> Software Input Panel -> Software-based Input Panel (SIP) (Choose 1 or more) -> SIP for Large Screens)
(7)添加平台管理器(Platform Manager)
(Catalog -> Platform Manager -> Platform Manager)
(8)添加Usb ActiveSync(USB Function)
(Catalog -> Third Party -> BSPs -> Emdoor Systems XSBase270: ARMV4I -> Device Drivers -> USB Function->USB Function Bus Drivers ->PXA27x USB Function)
特性的添加后,设置平台的属性。在“Platform”菜单下单击“Setting”,在Configuration下拉菜单中选择“Emdoor Systems XSBase270:ARMV4I Release”项,选择Locale选项卡,系统地理位置和环境语言支持的设置。Locales列表中,为最下
端的“中文( )”项打勾。在Default Language下拉菜单里选择“中文( )”为系统的默认语言。如图3-3所示。图3-3 选择操作系统默认语言
在Build Option列表中,只选择Enable Eboot Space in Memory(IMGEBOOT=1)和Write Run-time Image to Flash Memory(IMGFLASH=1)两项。如图3-4所示。
图3-4 程序组建选项设置
单击“Build OS”菜单下的“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注册表文件,文件中包含了对硬件的初始化的代码。
在“IF BSP_NOSERIAL!”与“END BSP_NOSERIAL!”两句代码之间,可以看到蓝牙串口的注册表初始化代码,下面只需要添加初始化红外串口的代码:
;Open the IR Serial Port
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SerialIR]
"Irq"=dword:14 ; 20 IRQ_STUART
"SysIntr"=dword:1b ; 27 SYSINTR_SFUART
"MemBase"=dword:40700000 ; STUART Register
"MemLen"=dword:40
"DeviceArrayIndex"=dword:82 ; STUART object
"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"="IRSerial Cable on COM3:"
"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文件。打开刚才的操作系统设计工程,选择Build OS菜单下的Make Run-Time Image命令,生成新的内核文件NK.bin。
3.4 操作系统的生成与下载
定制并组建Windows CE后,将会生成BootLoader——EBOOT.nb0文件和NK内核——nk.bin,将它们烧写XSBase270实验箱。
4 应用软件设计
4.1 应用程序编写环境
开发环境:Microsoft Visual Studio 2005
开发语言:Microsoft Visual C++ 2005
软件开发包:XSBase270 SDK
智能家居系统的应用程序采用Visual Studio 2005开发。Visual Studio是微软公司开发的Windows平台上的应用程序开发环境。Visual Studio可以创建Windows 下的Windows应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和Office插件[5]。Visual Studio 2005面向.net框架(2.0版本),可以开发跨平台的应用程序。
图4-1 Visual Studio 2005
4.2 智能家居人机接口设计
打开Visual Studio 2005,创建基于MFC Smart Device Application的VC++程序。如图4-2所示:
图4-2 新建智能家居的应用程序
到选择平台时选择XSBase270平台,删除默认的Pocket PC 2003平台。如图4-3所示。
图4-3 选择软件开发包支持
单击“Next”按钮选择应用程序类型和资源语言——程序界面上采用的语言的画面。如图4-4所示,选择“Dialog based”(基于对话框)类型,资源语言选择“中文()”。项目保留默认的选项。
图4-4 选择应用程序种类
默认的设置,一直到新建项目向导。IDE环境。集成环境的窗口分布如图4-5所示:
图4-5 Visual Studio 2005集成环境
将对话框设计成如图4-6所示:
图4-6 智能家居操作界面设计
表4-1 智能家居应用软件界面控件配置
控件类型 |
控件名称 |
功能 |
按钮控件 |
初始化GSM |
初始化GSM模块 |
开始摄像 |
打开摄像头,开始视频捕捉 |
|
停止摄像 |
停止摄像头视频捕捉 |
|
开始监听 |
打开ARM的9000号端口,打开网络通信 |
|
停止监听 |
关闭端口,停止TCP通信 |
|
冰箱 |
打开家中的冰箱设备 |
|
灯光 |
打开家中的灯光设备 |
|
微波炉 |
打开家中的微波炉设备 |
|
空调 |
打开家中的空调设备 |
|
关于 |
查看软件作者版权声明信息 |
|
退出程序 |
关闭未关闭的线程,退出程序 |
|
列表控件 |
消息窗口 |
用来显示用户发回的短信记录 |
图片控件 |
煤气 |
煤气传感器报警信号,报警时红色,常态时绿色 |
烟雾 |
烟雾传感器报警信号,报警时红色,常态时绿色 |
|
红外 |
红外传感器报警信号,报警时红色,常态时绿色 |
|
编辑框 |
信息框 |
实时显示系统运行情况 |
4.3串口通信功能设计
4.3.1 串口通信协议
串口通信协议采用CCESeries类,对此类的函数的调用,对串口的初始化、读写操作等,在不用串口的情况下,还可以关闭串口。
4.3.2 软件的
在Visual Studio的解决方案视图里添加类CCESeries,如图4-7所示。CCESeries类的函数如表4-2所示。
图4-7 在VS2005中CCESeries类
表4-2 串口操作类CCESeries的函数
函数作用 |
函数名称 |
打开串口 |
BOOL OpenPort(HWND pPortOwner, UINT portNo = 1, UINT baud= 9600,UINT parity= NOPARITY, UINT databits= 8,UINT stopbits= 0 ); |
关闭串口 |
Void ClosePort(); |
设置串口超时 |
BOOL SetSeriesTimeouts(COMMTIMEOUTS CommTimeOuts); |
读串口线程 |
Static DWORD WINAPI ReadThreadFunc(LPVOID lparam); |
写串口 |
BOOL WritePort(LPCTSTR lpString); BOOL WritePort(char *buf,int nSize); BOOL WritePort(char *buf); |
关闭读线程 |
Void CloseReadThread(); |
表4-3 串口操作类CCESeries的变量
变量类型 |
变量名称 |
作用 |
HANDLE |
m_hComm |
已打开的串口句柄 |
HWND |
m_hWnd |
此串口类所属的窗口句柄 |
HANDLE |
m_hReadThread |
读串口线程句柄 |
HANDLE |
m_hWriteThread |
写串口线程句柄 |
DWORD |
m_dwReadThreadID |
读串口线程ID |
DWORD |
m_dwWriteThreadID |
写串口线程ID |
HANDLE |
m_hReadCloseEvent |
读串口线程退出事件 |
HANDLE |
m_hWriteCloseEvent |
写串口线程退出事件 |
4.2.2.1 打开串口与配置串口
在Windows CE中,驱动程序分为本地设备驱动和流设备驱动两种[6]。本地设备如键盘、触摸屏等,在设备生产后是不会再更换的,的驱动设备的驱动程序必需的。而流接口设备驱动程序可以由方,支持添加到系统中的设备。而串口就属于流接口设备。
流设备驱动在系统中是以三位字符串后跟一位数字表示的,串口而言,这三位字符是“COM”(不包括引号)。当引用流接口驱动程序时,除了三位字符后跟一位数字以外,还要紧跟冒号“:”(英文半角冒号),冒号是必需的,是区别桌面Windows的设备驱动程序的命名规则。
该函数的流程图如图4-8所示:
图4-8 OpenPort函数流程图
(1)串口的打开所流驱动程序都将采用CreateFile函数打开串口设备。在Windows CE下,系统不支持设备的重叠I/O,在参数dwFlagsAndAttributes中传递FILE_FLAG_OVERLAPPED标志,返回的句柄要么是已打开的串口端口的句柄,或者是INVAILID_HANDLE_VALUE。CreateFile与大多数Windows函数不一样,打开失败时,不返回0。
CreateFile函数的原型如下:
HANDLE CreateFile(
LPCTSTR lpFileName, // 路径名
DWORD dwDesiredAccess, //控制模式
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //安全属性(也即销毁)
DWORD dwCreationDisposition, // 创建的
DWORD dwFlagsAndAttributes, // 属性
HANDLE hTemplateFile // 文件模板句柄
);
在CCESeries类中, HANDLE类型全局变量m_hComm存储CreateFile函数打开串口时的返回值,凭借此句柄可以控制打开的串口;以读写的打开串口。
(2)串口的设置
打开串口后,还对端口配置好的波特率、字符长度、停止位等等。在OpenPort函数中,使用两个函数GetCommState和SetCommState来配置串口。
函数原型如下:
BOOL SetCommState(HANDLE hRle, LPDCB lpDCB);
BOOL GetCommState(HANDLE hFile, LPDCB lpDCB);
这两个函数都包含了同样的参数,即已打开的串口的句柄和指向DCB结构的指针。DCB结构的设置如表4-4所示。
表4-4 OpenPort函数中的串口DCB配置
DCB定义项目 |
设置值 |
备注 |
BaudRate |
Baud |
设置波特率为传入型参baud的值 |
fBinary |
TRUE |
二进制模式 |
fParity |
TRUE |
支持奇偶校验 |
ByteSize |
Databits |
设置数据位为传入型参databits,范围4~8 |
Parity |
NOPARITY |
校验模式 |
StopBits |
Stopbits |
设置停止位为传入型参stopbits |
fOutxCtsFlow |
TRUE |
串口输出由端口的CTS线控制 |
fOutxDsrFlow |
TRUE |
串口输出由端口的DSR线控制 |
fDtrSensitivity |
DTR_CONTROL_ENABLE |
续表4-4 OpenPort函数中的串口DCB配置
DCB定义项目 |
设置值 |
备注 |
fDsrSensitivity |
FALSE |
|
fTXContinueOnXoff |
TRUE |
串口接收缓冲区已满时,且驱动程序已传送了XOFF字符,则驱动程序停止传送字符 |
fOutX |
FALSE |
XON/XOFF控制不用于控制串行输出 |
fInX |
FALSE |
XON/XOFF控制不为输入串行流使用 |
fErrorChar |
FALSE |
|
fNull |
FALSE |
串行驱动不忽略接收到的空字节 |
fRtsControl |
RTS_CONTROL_ENABLE |
|
fAbortOnError |
FALSE |
串口错误时,并不终止串口读写 |
(3)串口超时设置
设置好串口驱动操作的配置后,必要的是,设置端口的超时值。所谓超时,是指Windows CE.net在读串口和写串口的自动返回前等待读或写操作的长度。在程序中,用两个函数控制串行超时。
BOOL GetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts);
BOOL SetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts);
这两个函数都包含了对应的串行设备的句柄和COMMTIMEOUTS结构的指针,COMMTIMEOUTS结构定义为:
typedef struct _COMMTIMEOUTS{
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
DWORD ReadTotalTimeoutConstant;
DWROD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutConstant;
}COMMTIMEOUTS;
(4)的函数
设置串口的输入输出缓冲区。原型如下
BOOL SetupComm(HANDLE hFile, DWORD dwInQueue, DWORD dwOutQueue);
设置串口检测的事件集。
SetCommMask(HANDLE hFile,DWORD dwEvtMask);
函数,可以使线程等待如表4-5中的常见的串口驱动程序事件。
表4-5 串口驱动程序事件
事件标志 |
表达意义 |
EV_BREAK |
检测到中断 |
EV_CTS |
CTS更改状态 |
EV_DSR |
Data Set Ready信号更改状态 |
EV_ERR |
串行驱动程序检测到错误 |
EV_RKSD |
Receive Line Signal Detect 行更改状态 |
EV_RXCHAR |
接收到字符 |
EV_RXFLAG |
接收到事件字符 |
EV_TXEMPTY |
传输缓冲区为空 |
4.2.2.2关闭串口
调用CloseHandle可以关闭串行端口,用关闭在打开串口时创建的那个句柄即可关闭串口了。方法如下
CloseHandle(m_hComm);
关闭线程函数:
BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode);
,hThread为要关闭的线程的句柄。dwExitCode为0。若关闭,则返回非零值。关闭串口函数的工作流程如图4-9所示。
SHAPE \* MERGEFORMAT
图4-9 ClosePort函数流程图
4.2.2.3 串口读线程
读串口ReadFile函数原形:
BOOL ReadFile(
HANDLE hFile, //文件的句柄
LPVOID lpBuffer, //用于保存读入数据的缓冲区
DWORD nNumberOfBytesToRead, //要读入的字符数
LPDWORD lpNumberOfBytesRead, //从文件中读入的字符数
LPOVERLAPPED lpOverlapped //异步读取描述,在Windows CE中为NULL
);
在该线程中,若串口读完一条信息,则发送系统消息到系统窗体,该消息的名称为WM_RXCHAR_ALL,是用户自定义消息。发送给系统窗体的附带消息包含收到的消息的内容和消息的长度。
发送系统消息的API函数SendMessage的原型如下:
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
图4-10 串口读线程流程图
4.2.2.4 写串口
在CCESeries类中,一共编写了三个写串口的函数,为的是不同情况下的调用。如要向写已知长度的字符串,可以采用WritePort(char *buf,int nSize)函数。写未知长度字符串时,采用WritePort(char *buf)函数,字符串的长度将在函数内部计算。前者了写串口的。这三个函数中,采用了的API函数WriteFile(),它的函数原型如下:
BOOL WriteFile(
HANDLE hFile, // 文件句柄
LPCVOID lpBuffer, // 数据缓存区指针
DWORD nNumberOfBytesToWrite, // 要写的字节数
LPDWORD lpNumberOfBytesWritten, // 用于保存写入字节数的存储区域的指针
LPOVERLAPPED lpOverlapped // OVERLAPPED结构体指针,CE里设为NULL
);
4.2.2.5 串口类的调用
在主程序中,调用此CCESeries类,以操作串口的目的。
在定义智能家居的窗口的CSmartHomeDlg类的头文件CSmartHomeDlg.h文件中,添加CCESeries.h头文件。并且新建public公共型变量m_BTSerial(蓝牙串口)和m_IRSeries对CCESeries类的实例化。
CCESeries m_BTSerial;
CCESeries m_IRSerial;
在用于CSmartHomeDlg类函数的定义的文件CSmartHomeDlg.cpp文件中,采用形如m_BTSerial.OpenPort(this->m_hWnd,1,9600)的串口类函数的调用。
4.2.2.6 串口的监听
在读串口线程中,读完串口的一条信息后发送名为WM_RXCHAR_ALL的系统消息给系统窗体。在窗体程序中,对其响应。
在CSmartHomeDlg.cpp文件中,添加一条消息响应的声明:
ON_MESSAGE(WM_RXCHAR_ALL,OnComRecvMsg)
OnComRecvMsg为对其消息响应的函数,函数的声明如下:
afx_msg long OnComRecvMsg(WPARAM wParam, LPARAM lParam);
“afx_msg”说明该函数是一消息响应函数。
4.4 GSM通信模块
智能家居以GSM网络数据的无线传输网络,基于GSM网络上的短信息服务,智能家居的远程安全监控和无线报警的功能。
4.4.1 设计原理
4.4.1.1 PDU编码规则
自短信息技
术被开发到现在,对短信息的控制 包含了Block Mode、基于AT的Text Mode基于AT指令的PDU Mode。
使用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码:
08 91 68 31 08 20 01 05 F0 11 00 0B 91 31 58 81 27 64 F8 00 00 00 06 C8 32 9B FD 0E 01
表4-6 发送PDU包解析
分段 |
含义 |
说明 |
08 |
SMSC地址信息的长度 |
共8个八位字节(包括91) |
91 |
SMSC地址格式(TON/NPI) |
用国际格式号码(在前面加‘+’) |
68 31 08 20 01 05 F0 |
SMSC地址 |
8613800250500,补‘F’凑成偶数个 |
11 |
参数(TP-MTI/VFP) |
发送,TP-VF用格式 |
00 |
消息基准值(TP-MR) |
0 |
0B |
地址数字个数 |
共11位,不包括补足的‘F’ |
91 |
地址格式(TON/NPI) |
用国际格式号码(在前面加‘+’) |
68 31 18 48 31 46 F9 |
地址(TP-DA) |
8613818413649,补‘F’凑成偶数个 |
00 |
协议标识(TP-PID) |
是普通GSM类型,点到点 |
00 |
用户信息编码(TP-DCS) |
7-bit编码 |
00 |
期(TP-VP) |
5分钟 |
06 |
用户信息长度(TP-UDL) |
长度6个字节 |
C8 32 9B FD 0E 01 |
用户信息(TP-UD) |
“Hello!” |
发送短信的报文格式,知道短消息中心号码是:+8613800210500,对方号码是:13818413649,消息内容是“Hello!”。
实例二、接收短信时的PDU码
08 91 68 31 08 20 01 05 F0 84 0D 91 68 31 58 81 27 64 F8 00 08 30 30 21 80 63 54 80 06 53 4E 4E 1C 00 21
表4-7 接收短消息PDU包解析
分段 |
含义 |
说明 |
08 |
SMSC地址信息的长度 |
共8个八位字节(包括91) |
91 |
SMSC地址格式(TON/NPI) |
用国际格式号码(在前面加‘+’) |
68 31 08 20 05 05 F0 |
SMSC地址 |
8613800250500,补‘F’凑成偶数位 |
84 |
参数(TP-MTI/MMS/RP) |
接收,无更多消息,有回复地址 |
0B |
回复地址数字个数 |
共11个十进制数(不包括‘F’) |
91 |
回复地址格式(TON/NPI) |
用国际格式号码(在前面加‘+’) |
68 31 58 81 27 64 F8 |
回复地址(TP-RA) |
8613851872468,补‘F’凑成偶数位 |
00 |
协议标识(TP-PID) |
是普通GSM类型,点到点 |
08 |
用户信息编码方(TP-DCS) |
UCS2编码 |
30 30 21 80 63 54 80 |
戳(TP-SCTS) |
2003-3-12 08:36:45 +8时区 |
06 |
用户信息长度(TP-UDL) |
长度6个字节 |
53 4E 4E 1C 00 21 |
用户信息(TP-UD) |
“华东!” |
短消息中心号码是:+8613800210500,对方号码是13851872468,消息内容是“华东!”。
4.4.1.2 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 软件的
4.4.2.1 PDU编码解码
短信的PDU解码和编码的功能由智能家居软件工程中的CEncode类。
CEncode类的函数如表4-9所示:
表4-9 CEncode类的方法
方法 |
备注 |
Int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength) |
可打印字符串转换为字节数据 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} |
int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength) |
字节数据转换为可打印字符串 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01" |
int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength) |
7bit编码 |
int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength) |
7bit解码 |
int gsmEncode8bit(const char* pSrc, unsigned char* pDst, int nSrcLength) |
8bit编码 |
int gsmDecode8bit(const unsigned char* pSrc, char* pDst, int nSrcLength) |
8bit解码 |
int gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength) |
UCS2编码 |
int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength) |
UCS2解码 |
int gsmInvertNumbers(const char* pSrc, char* pDst, int nSrcLength) |
顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补'F'凑成偶数。如:"8613851872468" --> "683158812764F8" |
int gsmSerializeNumbers(const char* pSrc, char* pDst, int nSrcLength) |
两两颠倒的字符串转换为顺序的字符串。 如:"683158812764F8" --> "8613851872468" |
Int gsmDecodePdu(const char* pSrc, SM_PARAM* pDst) |
PDU解码,用于接收、阅读短消息 |
int gsmEncodePdu(const SM_PARAM* pSrc, char* pDst) |
PDU编码,用于编制、发送短消息 |
在该类中,关键的函数为gsmDecodePdu函数与gsmEncodePdu函数,它们将在智能家居中的对话框类CSmartHomeDlg中被调用。调用方法将在下文介绍。gsmDecodePdu函数与gsmEncodePdu函数分别用来在发短信时PDU规范编码,对串口收到的PDU编码解码。编码与解码在头文件中定义的短消息结构体取值或填充。是定义的关于编码的常量和填充短消息的数据结构。在接收与发送短信时是共用的。
#define GSM_7BIT 0 //7Bit编码
#define GSM_8BIT 4 //8Bit编码
#define GSM_UCS2 8 //UCS2编码
typedef struct {
char SCA[16]; // 短消息服务中心号码(SMSC地址)
char TPA[16]; // 号码或回复号码(TP-DA或TP-RA)
char TP_PID; // 用户信息协议标识(TP-PID)
char TP_DCS; // 用户信息编码(TP-DCS)
char TP_SCTS[16]; // 服务戳字符串(TP_SCTS), 接收时用到
char TP_UD[161]; // 原始用户信息(编码前或解码后的TP-UD)
char index; // 短消息序号,在读取时用到
} SM_PARAM;
4.4.2.2 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 \* MERGEFORMAT
图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 \* MERGEFORMAT
图4-14 CEncode类gsmEncodePdu函数工作流程
gsmString2Bytes函数的作用是将可打印字符串转换为字节数据,如"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01},输入源字符串指针和输出的源字符串长度,输出数据指针,返回数据的长度。流程图如图4-15所示:
SHAPE \* MERGEFORMAT
图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 \* MERGEFORMAT
图4-16 gsmBytes2String函数工作流程
低四位是每个字节数据与0x0f位与。每四位表达的数值为0~15,而在tab数组中,从tab[0]到tab[15],对应的字符为‘0’到‘9’和‘A’到‘F’,此算法可以由数值型到字符型的转换,最后整条字节数据到字符串的转换。
gsmEncode7bit函数的作用是7bit编码。输入源字符串指针和源字符串的长度,输出字符串指针和编码串长度。工作流程图如图4-17所示。
SHAPE \* MERGEFORMAT
图4-17 gsmEncode7bit函数流程
gsmDecode7bit函数用于7位码的解码,输入源编码串指针和源编码串长度,输出字符
串指针和 字符串的长度。流程图如图4-8所示:
SHAPE \* MERGEFORMAT
图4-18 gsmDecode7bit函数工作流程
gsmEncode8bit函数用于8位码编码,计算机采用的8位码,源编码串和字符串是的,其编码工作用memcpy函数简单的复制即可。
gsmDecode8bit函数用于8位码解码,与gsmEncode8bit一样只需要采用简单的复制即可,区别在于在字符串末尾加“\0”结束字符。
gsmEncodeUcs2函数用于UCS2编码,PDU编码规则,UCS2码采用的是16位双字节的编码。工作如图4-19所示。
SHAPE \* MERGEFORMAT
图4-19 gsmEncodeUsc2函数工作流程
gsmDecodeUsc2函数用于UCS2码的解码。它的工作流程如图4-20所示:
SHAPE \* MERGEFORMAT
图4-20 gsmDecodeUcs2函数工作流程
gsmEncodeUcs2函数和gsmDecodeUcs2函数分别用了作用相反的两个API函数——MultiByteToWideChar和WideCharToMultiByte函数。它们的作用分别为将短字符(用8位数据表示的字符)转换为宽字符(16位数据表示的字符,如Unicode编码),和将宽字符转换为短字符。
gsmInvertNumbers函数的作用是将形如“8613851872468”的字符串两两颠倒成“683158812764F8”,源字符串长度为奇数时,补字符‘F’凑成偶数。流程图如图4-21所示。
SHAPE \* MERGEFORMAT
图4-21 gsmInvertNumbers函数工作流程
4.4.2.3 收发短信
(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)发送短消息
在发送短信之前,要对数据结构体SM_PARAM数据填充。短消息服务中心和号码的格式是不包含加号却包含代码的国际标准格式号码,如8613812341234。在数据填充之前要将号码文本。
在CSmartHomeDlg类中,对短信编码解码类CEncode和SM_PARAM结构体实例化。
CEncode m_encode;
SM_PARAM param;
在填充好机构体以后,用下面一句
nPduLength=m_encode.gsmEncodePdu(¶m,pdu);
对短消息结构体PDU编码,编码结果放入pdu数组中,PDU长度返回到nPduLength。流程图如图4-23所示:
SHAPE \* MERGEFORMAT
图4-23 发送短信流程
4.5 图象采集模块
中星微摄像头采用了中星微301PLUS主控芯片。该芯片是一款高性能图像压缩芯片,输出MIPEG视频流数据。MIPEG(Motion JPEG)主要是基于静态视频压缩发展起来的技术,特点是不考虑视频流中不同帧之间的,只单独对某一帧压缩,通常可6:1的压缩率。它的误差稳定性非常好,可以获取清晰度的视频图像,而且还可以灵活设置各路视频清晰度,压缩帧数。
4.5.1 摄像头驱动程序
该摄像头的官方了其在Windows CE环境下的驱动程序zc030x.dll和在VC下对其编程的lib库文件zc030xlib.lib。只要在智能家居的工程属性中,将其的lib库文件导入即可使用它的函数。
:Project菜单->SmartHome Properties,选择左边列表Configuration Properties->Linker->Input
导入lib库文件操作的截图如图4-24所示:
里输入要调用的LIB库文件名 " src="/uploads/20090709104739527.gif" width=138>
图4-24 在VS2005中添加lib库文件
图像采集模块用到的主要函数有:
capInitCamera()用来初始化视频设备,并获取当前可用的视频设备数目;
capSetVideoFormat()设置视频格式和分辨率。本系统使用的视频格式为RGB24,分辨率为320×240像素;
capGetPicture()获取摄像头最近捕捉的一幅位图,存入指定的缓存中
capCloseCamera() 关闭视频设备
4.5.2 视频捕捉和视频信息传送
摄像头工作流程了初始化摄像头和捕捉视频和关闭摄像头等流程,详细的流程如图4-25所示:
SHAPE \* MERGEFORMAT
图4-25 摄像头的工作流程
设置视频格式、捕捉图象和发送图象等位于线程CaptureThreadProc中,该线程在点击智能家居系统应用程序界面上的“打开摄像头”按钮后创建,在点击“关闭摄像头”后关闭。
视频数据的分包发送在视频监控功能中是关键的。在里,系统将摄像头采集到的视频数据存储在临时的数组中,对临时数组的数据分割,数据的分包存储。在系统中,每个视频数据包的大小为1440字节。在系统的运行测试中,断点调试的,知道摄像头capGetPicture()函数获取到的一帧图象信息的大小大概在4000字节到5000字节之间,连续发送四个到五个数据包即可将一幅画
面的数据发送到客户端。
4.6 以太网通信模块
在智能家居中,嵌入式平台充当服务器的角色,的PC视频监控端充当客户端的角色。服务器端与客户端之间的通信基于TCP/IP协议。
4.6.1 TCP/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-26 IP层与以太网驱动器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 \* MERGEFORMAT
图4-27 TCP服务工作流程图
在初始化阶段,调用WSAStartup()函数以在应用程序初始化Windows Socket DLL,调用后,应用程序即可采用Windows Socket中的API函数。之后,在程序中用于监听网络的Socket,并定义其采用的通讯协议——TCP协议。操作的函数是socket()。它的原型是:
SOCKET PASCAL FAR socket( int af, int type, int protocol )
个形参用于指定套接字的通信类型,当type为SOCK_STREAM时,为遵从TCP协议的通信,若要遵从UDP协议,应设置为SOCK_DGRAM;在智能家居中,采用前者。
流程,接下来要绑定IP地址和端口,地址和端口是客户端将要连接的,调用bind()函数可以操作,是bind()函数的原型。
int PASCAL FAR bind( SOCKET s, const struct sockaddr FAR *name,int namelen );
s为被操作的Socket,name是ARM端的IP地址。namelen为IP地址的长度。
在监听网络,ARM服务器端监听队列来客户端的连接请求。listen()函数可以操作。
int PASCAL FAR listen( SOCKET s, int backlog );
s为要操作的Socket;backlog为最大连接数,在系统中设置为8。
在客户端发出连接请求时,ARM客户端调用accept()函数,从而完整的连接操作。
在智能家居系统的软件设计中,将监听以太网线程来。
SHAPE \* MERGEFORMAT
图4-28 TCP读线程工作流程
4.7 PC端视频监控模块
该模块采用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” |
|
编辑框 |
IP |
name:“txtIP”,text:“192.168.0.56” |
端口 |
name:“txtPort”,text:“9000” |
|
TCPClient |
Host:“192.168.0.56”,Port:“9000” |
|
图像框 |
name:“VideoFrame”,height:“240”,width:“320” |
,Image控件用于显示视频,它一次只显示一帧静态的图象,人眼有视觉暂留效应,图象的更新也快,人眼看起来是的图象。界面中的文本框控件是能在对方的IP地址和端口号的情况下,输入不同的IP号和端口号,再点击设置按钮,从而TCPClient控件的Host属性(用于指定对方IP)和Port属性(用于指定对方端口),再打开以太网通信通道,向ARM服务端连接请求。
SHAPE \* MERGEFORMAT
图4-30 PC客户端工作流程
在程序设计中采用了Delphi中的TJpegImage和TMemory。TMemory用于存储TCP层发送给应用层的数据包包含的数据,在接收完数据包后,程序创建TJpegImage类型jpg,jpgLoadFromStream()方法装载缓冲区中的数据,最后在窗体上的VideoFrame图片控件上显示。
4.8 家电控制及传感器模块
在该模块中,家电控制传感器报警模块依托89C51单片机的I/O口。传感器的报警状态RS232串口向ARM发送的字符串,由ARM端的应用程序解析。类似的,ARM端串口发送指定格式的字符串到单片机串口,串口打开的LED,以表示对应的家电的电源的打开。
4.8.1 单片机串口的配置
在智能家居系统的家电控制板中,单片机的串行口通信采用10位为一帧的工作1。这10位中,共包括1个起始位、8位数据位和1个停止位[10]。
起始位 |
D0 |
D1 |
D2 |
D3 |
D4 |
D5 |
D6 |
D7 |
停止位 |
图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所示。
% |
1 |
1 |
1 |
1 |
报头 |
家电1标志位 |
家电2标志位 |
家电3标志位 |
家电4标志位 |
图4-33 家电
控制字符串格式
该控制字符串共五位,包含报头‘%’字符和四位分别表示不同家电的标志位。要控制家电的电源开和关,只要在对应的位上置位(设为1)或重置(设为0)即可。如要启动家电1和4,2和3的关闭状态,则向单片机发送“%1001”字符串即可。
4.8.3 单片机程序流程
单片机的程序采用C语言编写。单片机的工作主流程如图4-所示。单片机的初始化包括对定时控制寄存器的初始化、对定时计数器1的初始化,串口工作的初始化波特率的设置等。
在传感器状态字符串信息的发送过程中,采用逐字发送的发送字符串。这是串口工作1的约束,每次发送的数据为8位,即字节,亦即字符。当每次发送完字符,发送中断标志位TI被置位为1时,再发下字符,直到四个字符发送完毕。
图4-34和图4-35分别为单片机的主程序流程和查询传感器状态的程序流程。
|
|
|
|
|
|
|
图4-34 单片机工作主程序流程 图4-35 单片机查询传感器状态程序流程
当串口有信息到达时,单片机串口中断,运行中断服务程序,工作流程如图4-35所示。
SHAPE \* MERGEFORMAT
图4-36 串口中断服务程序流程
4.8.4 ARM端控制和报警流程
带有控制家电的字符串 " src="/uploads/20090709104744192.gif" width=176> SHAPE \* MERGEFORMAT
图4-37 ARM端控制和报警流程
在智能家具系统的ARM端应用程序中,在报警状态时,界面上的对应的图片控件会闪烁,即从绿色向红色反复变换。图片的闪烁采用VC++里的多媒体定时器Timer。在报警状态时,启动定时器,报警的标志全局变量的数值,对的图片控件一次颜色变换,当定时器到时时,触发OnTimer()事件,再对对应的图片控件图象的变换。
5 系统测试
5.1测试环境
PC操作系统:Microsoft Windows XP Profesional SP2
软件开发及测试平台: Visual Studio 2005 + XSBase270 SDK
+ ActiveSync4.5
嵌入式硬件平台:XSBase270实验箱
嵌入式操作系统平台:Microsoft Windows CE 5.0 .net
5.2 测试
(1)测试视频捕捉和视频远程监视模块
将摄像头插入XSBase270实验箱的USB接口。打开电源按钮,启动Windows CE。操作系统识别到USB设备——即摄像头,如图5-1所示。稍后将安装它的驱动程序。
图5-1 操作系统识别到USB设备
打开Windows CE的控制面板,如图5-2所示。新建基于“COM2”端口的网络连接——“我的连接”。该连接采用115200的波特率,数据位8位,停止位1位,无数据流控制,如图5-3所示。并且在控制面板中的PC连接设置为“我的连接”。如图5-4所示。
图5-2 Windows CE 控制面板
图5-3 “我的连接”的属性
图5-4 修改默认的PC连接
将USB线插入位于XSBase270的扩展板上的USB_SLAVE口,另一端连接到PC机上的USB口。稍后,PC上的ActiveSync文件同步软件即可自动识别到XSBase270移动设备。在Windows CE的任务栏上,“已连接”图标,如图5-5所示。在PC端,好PC跟XSBase270移动设备的合作关系。ActiveSync软件上将显示已同步字样。如图5-5所示。
图5-5 文件同步合作关系后的程序界面
使用ActiveSync软件将摄像头的驱动程序ZC030x.dll文件传输到实验箱的Windows文件夹下,并且在如图5-1所示的的窗口中输入“ZC030x.dll”,系统即可安装好摄像头的驱动。
将PC机的IP地址设为192.168.0.1,这是能够与IP为192.168.0.56的XSBase270在同网络段,使视频数据能够的被PC接收。将标准的超五类线插入XSBase270主板上的以太网接口,另一端与PC的网卡接口相连接。
Visual Studio 2005 打开智能家居的解决方案SmartHome.sln。点击运行,Visual Studio 2005自动将程序SmartHome.exe下载到XSBase270实验箱中运行。点击“开始监听”按钮。运行界面如图5-6所示:
图5-6 智能家居软件界面
在PC端打开视频监视工具。输入的ARM端的IP和的端口,点击“设置”按钮,在ARM端点击“打开摄像头”,在PC端点击“开始监视”。即可在PC端看到ARM端上摄像头捕捉到的图象。如图5-7所示。
图5-7 PC端视频监控画面
(2)验证CEncode类的可行性。
将属于CEncode类的两个文件——Encode.h和Encode.cpp文件移植到PC机平台上使用,VC++ 6.0编写采用该类PDU编码解码的测试程序。该程序往手机发送短信,读取手机SIM卡里的信息,以验证CEncode类程序对PDU码的解码与编码的可行性。测试程序的界面如图5-8所示。
将手机SIM卡插入GSM模块的卡槽,使用全功能串口线连接GSM模块与PC机,插入模块附带的9V变压器给模块供电。
启动测试软件,设置好服务中心号码和号码,发送短信测试和读取短信测试,结果证实该软件与GSM模块协同工作,CEncode类可用。
图5-8 PDU编码
解码测试程序
(3)验证家电控制板的可用性
使用标准串口线连接家电控制板与PC机。使用“串口调试助手”软件对串口的读写操作。往家电控制板输入形如“%0001”的字符串,观察能启动对应的LED。同样的,按对应的“传感器”按钮,观察PC机能收到的字符串。测试,家电控制板能够运行。
6 总结与展望
毕业设计,我到了嵌入式开发的流程,编写众多的程序,强化了的编程能力,了对计算机语言理论的理解。
和精力的原因,智能家居系统的功能设计还,在未来充裕、技术更成熟的情况下,功能设计可以,如:
(1)GSM模块、家电控制板与ARM的协同合作
(2)图象捕捉算法的优化,以太网数据传输的优化。
(3)用户界面友好度的强化,用户访问权限和控制权限的设计。
(4)系统的运行信息实时保存。如传感器报警的记录,用户的登陆和控制的记录等。