外围报警设备通过S3C2440提供的PWM定时器,由通用输入输出GPIO口来控制。
1.2 系统软件设计
1.2.1 AT指令集
本系统使用的GPRS模块采用的是GSM07.05规范,它规定了SMS的DTE-DCE接口标准,即AT指令集。AT(Attention AT)命令集是从TE(Terminal EQUIPment)或DTE(Data Terminal Equipment)向TA(Terminal Adapter)或DCE(Data Circuit Terminating Equipment)发送,并通过TATE 发送AT 命令来控制MS(Mobile Station)的功能,实现与GSM 网络业务的交互。用户可以通过AT 命令进行控制[4]。本文主要使用短消息相关的AT命令集。如发送AT+CMGF=n,其中n为0,选择PDU格式,n=1,选择文本方式。如发送AT+CSCA=<string>来选择运营商,string=+8613800270500;即选择中国移动。在文本格式下发送AT+CMGS=“string”(string)为对方手机号码,成功则返回“>”然后输入要发送的内容以“^Z”结束。本文的GPRS类都是通过调用串口驱动来实现相关的功能。
1.2.2 Windows CE下的驱动编写
Windows CE是微软公司推出的嵌入式实时操作系统,凭借其简单易用,功能强大,在智能手机、PDA以及汽车电子领域有广泛的应用。本文系统中的驱动编写是软件设计的核心内容。
基于Windows CE的2种驱动模型是流接口驱动和本机驱动模型,本机驱动模型是操作系统本身的一部分,例如电源管理,这些驱动是通用的驱动。流驱动则是指一般的驱动,具有可定制的接口和功能,是专用的驱动。本文所有驱动都是流驱动,流驱动将外部设备当作文件进行操作,因此应用程序可以很方便地使用系统API文件进行操作。流驱动由一组标准的函数集合来实现,在Windows CE中定义的流接口函数有12个,主要包括XXX_Init、XXX_Deinit、XXX_Open(由应用程序调用CreateFile()函数打开驱动)、XXX_ Close(由应用程序调用CloseHandle()函数关闭驱动)、XXX_Read(由应用程序调用ReadFile()函数打开驱动)、XXX_Write(由应用程序调用WriteFile( )函数打开驱动)、XXX_Seek、 XXX_Power
Up、XXX_Pow-erDown、XXX_IOControl。其中,XXX是驱动程序的设备名称[5]。
本文的流驱动需要具备3个功能:(1)驱动数据采集模块;(2)驱动报警器电路;(3)驱动GPRS模块。
1.2.3流驱动的实现
(1)将驱动取名为RDA(Remote Data Acquisition)。由于要在操作系统层面调用设备,因此首先应该完成对硬件,尤其是寄存器的虚拟地址分配,在函数RDA_Init()中实现。通过调用Windows CE提供的VirtualAlLOC()和VirtualCopy()访问物理内存,其中前者负责保留虚拟内存,后者负责绑定物理内存和虚拟内存。实际上最终是通过访问虚拟内存来完成访问物理内存的,主要部分代码如下:
v_pAdcPreg=(volatileADCreg*)VirtualAlloc(0,sizeof(ADCreg),MEM_RESERVE,PAGE_NOACCESS);
…if (!VirtualCopy((PVOID)v_pAdcPreg, (PVOID)(ADC_
BASE_PHY_ADD>>8),sizeof(ADCreg),PAGE_PHYSICAL| PAGE_
READWRITE | PAGE_NOCACHE))
v_pIOPregs=(volatile IOPreg*)VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE,PAGE_NOACCESS);…
接着系统通过v_pAdcPreg和v_pIOPregs来调用各自的寄存器进行初始化,其中ADC_BASE_PHY_ADD和IOP_BASE_PA是硬件物理地址。
随后完成RDA_IOControl(),这个函数负责完成修改设备的功能,例如本文的数据采集模块有8路通道,因此每次采样时都需要转换通道,同时采样频率也是可以转换的,所有的控制码都在头文件中完成。通过控制码用户可以自由选择通道,这与本文的要求完全一致。
最重要的是读函数RDA_Read(),应用程序通过读函数与底层驱动联系,应用程序通过ReadFile()函数读出ADC寄存器的值。
PUBLIC DWORD RDA_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
最后,在驱动程序关闭时,应用程序通过CloseHandle( )函数来调用RDA_Close ( )关闭。
1.2.4应用程序的实现
在流驱动编写完成后,通过PB完成编译,加入注册表信息,然后定制专有系统,这样就可以在自己定制的系统中调用驱动。应用程序的编写步骤如下,首先利用PB生成所需的SDK,并且安装,其次编写界面利用模拟器进行仿真,最后连接硬件,打开驱动测试程序。本文的所有程序已经在EVC4.0中编写实现。
本系统需要完成触摸屏的功能、视频采集模块功能以及用户自定的四路数据采集功能,因此窗体主线程中加入了:ADC采集、触摸屏控制、视频采集以及反馈模块等4个子线程。图4是应用程序的基本流程图。
2 实验结果
在测试过程中,系统会根据用户发送的短信内容,实时控制与显示所采集的数据。系统采集到的电器电压、室内温度、湿度以及热水器流量与实际情况完全相符。而系统的控制功能也很好实现,当系统采集到的数据大于阈值时,例如当室内温度过高、湿度过大、流量过大等异常情况发生时,报警信息都会由远程系统实时传递到用户的手机;视频采集系统主要由主机控制采集,用户可以方便地通过系统进行监控。因此通过实际测试,系统可以实现所需要的功能且具有良好的人机交互界面,实用性很强。
本文基于ARM9内核以及Windows CE嵌入式操作系统,同时结合GPRS技术,提出一种远程数据采集和控制的方法。利用嵌入式系统的低功耗、低成本、多任务以及高可靠性和高实时性等特点,通过设计、调用核心的流驱动函数,实现了一个具有远程数据采集和控制功能的应用系统,扩展相应的外围设备可以将该系统应用于更多领域。在后续的工作中,将继续研究利用另一个嵌入式系统作为客户机,通过MMS协议模块发送实时图像数据,从而增强系统的功能,进一步加深在物联网和智能家居控制等领域的应用。
参考文献
[1] 凌有铸,徐晓光,潘伟.基于WinCE的嵌入式远程实时监控系统[J].计算机技术与发展,2007,17(2):204-206.
[2] 王黎明,陈双桥,闫晓玲,等.ARM9嵌入式系统开发与实践[M].北京:北京航空航天大学出版社,2008.
[3] Samsung EleCTRonics.S3C2440A User Manual[Z].2004.
[4] TC35i AT Command Set[Z].2006
[5] 刘彦峰,李峥. Windows CE和桌面Windows 2000/XP设备驱动开发的区别[J].电子技术应用,2010,36(3):127-132.