文章来源:http://www.emtronix.com/case/case2008187.html
本文介绍一种低成本的、支持中文短信的SMS远程数采控制方案,系统以英创公司嵌入式主板ETR186为核心,结合ETA205、ETA402、ETA102、ETA401、ETA724、ETA203和西门子GSM模块MC39i组成,配合键盘和液晶以实现数据显示和控制输出等功能,同时提供C++编写的例程。系统实现功能如下:
- 8通道电压采集(A/D)输入。
- 4路数字信号输入。
- 4路继电器控制输出。
- 定时发送SMS短信到指定号码(手机)。
- 通过手机发送SMS短信(命令)到系统,控制系统中的继电器。
- 通过手机发送SMS短信(命令)到系统,查询系统当前AD值、端口状态等信息。
图 1:系统组成框图
系统运行时,每秒采集一次AD值和数字IO输入状态,并刷新一次屏幕。每小时向指定号码发送一条短信,短信以中文形式发送(PDU模式),内容包括当前采集的电压值、输入数字电平状态和继电器状态。如果短信发送失败,系统将每隔30S重发短信,重发两次后仍然失败时,系统重启GSM模块,并再次重发。用户可通过发送一条以CR开始的命令到系统,以控制系统中的继电器,或查询系统当前的工作状态。关于CR命令,将在后面的文章中介绍。
从系统框图可以看出,系统硬件组成是一目了然。案例中采用的是英创公司的现成模块,各模块资料可以在英创公司网站上找到,客户在实际开发过程中可直接向英创公司索要此类配套模块的电路原理图,以便进行整体的外围电路设计,实现合理的产品结构。
C++例程采用基于事件驱动(也称消息驱动)的应用程序框架进行编程,客户可以很方便的对例程进行修改,使其成为符合客户自身平台的应用程序。基于事件驱动方式编写的应用程序稳定性高、结构清晰、维护方便,它已成为我们向客户重点推荐的编程方案之一,关于事件驱动的原理介绍请参考英创公司网站文章:
《嵌入式系统应用程序方案之一——基于事件驱动的应用程序框架》。本例程中主要事件(消息)和程序如下:
- CMD_NOP:当系统没有实质性消息时而生成的“空消息”,系统此时调用短信类的 Running()函数,处理GSM 模块和ETR186 模块之间的数据流,完成短信的发送和接收。若接收到短信,程序将生成CMD_SMSARRIVED 消息。
- CMD_SEC:该消息每秒由系统产生,或由用户按键生成。消息中调用函数 IOTask.DO()、ADTask.DO()和Display.RefScreen(),分别完成采集输入数字信号状态、采集AD值和刷新LCD显示的功能。
- CMD_30SEC:该消息每30S由系统产生,消息主要完成短信发送状态检查和短信发送失败时的自动重发。在本消息中还有一定时发送任务,定时发送时间间隔为1小时。
- CMD_SENDSMS:在消息中调用短信类的Send()函数,按指定格式发送一条中文短信到指定号码(手机)。短信内容包括A/D采样值、数字IO状态和继电器状态。
- CMD_SMSARRIVED:接收手机发来的控制命令,调用ControlRelay()函数翻译、执行命令,并生成CMD_SENDSMS消息,返回一条短信到指定号码。
中文短信的发送是本案例的核心。短信发送有两种模式:文本模式(Text Mode)和PDU(protocol description unit)Mode。文本模式只能发送普通的ASCII字符,而要发送图片、铃声、其它编码的字符(如中文)就必须采用PDU模式。关于PDU的数据格式,读者可以查阅相关资料,这里不做详细介绍。在程序中,采用C++的类来实现SMS 收发的功能,在SMSManager 类对象中定义了5 个公共函数如下:
1. int Init( );
启动SMS 短信收发功能,该函数需要在启动短信收发时调用。
2. int Stop( );
终止当前的短信收发操作,若此时还有未发完的短信,该短信则不再发送。
3. int Send( struct SMS_DATA* pSMS );
发送短信数据。输入参数为短信数据结构指针,该结构包括对端电话号码、SMS内容(<=140 字节)等。
返回值 = 0:短信发送成功
!= 0:短信发送失败
4. int Recv( struct SMS_DATA* pSMS )
读取短信数据。输出参数为短信数据结构指针,该结构包括发送端电话号码、SMS内容。
返回值 = 0:无短信。
> 0:已读到有效短信,返回值为该短信数据的长度。
5. int Running( );
短信数据收发链路层数据处理,需要不断调用该函数。
返回值 = 进行短信收发的各个状态编号。
注意:为保证中文短信发送正常,需把unicode 的相关转换表文件用tdrf 工具下载到系统中。
短信收发需要在主板与GSM模块之间进行频繁的数据交换,ETR186通过COM2口与GSM模块进行通信,但由于ETR186采用的RDC8822 CPU内部的串行通信单元没有FIFO,在高波特率下通信,数据就很容易丢失。值得欣慰的是,RDC8822提供了两个DMA通道,这两个DMA通道可以直接应用于串行口通信,这样不仅保证了数据通信的可靠性,而且提高了CPU的执行效率。在英创公司网站文章
《ETR186串口通信DMA实现方法》中,对ETR186串口的DMA应用作了较为详细的介绍。
用户可通过手机发短信来控制系统中继电器断开或闭合。例如发送到系统的短信为:CR1O2C3C4O,其中CR为命令名(Control Relay的第一个字母),1、2、3、4分别表示要控制的继电器,O(OFF)表示断开,C(CLOSE)表示关闭(闭合)。命令不分大小写。CR1O2C3C4O命令的控制结果是:指定系统的继电器1断开、继电器2闭合、继电器3闭合、继电器4断开。
图 2:短信界面
当系统接收到短信后,无论短信中的命令是否正确,系统都将返回一条短信。如果命令格式正确,系统将自动发送一条与系统定时发送的内容一致的短信。如果命令格式不正确,系统将返回error。
本系统已经过笔者测试,在源程序中有大量注释以方便读者对程序阅读或修改。但在实际应用中,现场控制要求千差万别,本方案仅从理论的角度出发,搭建了一个可远程监控的数采控制系统,提供给读者一个思路和参考,希望能对读者有所帮助。
文章评论(0条评论)
登录后参与讨论