文章来源: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消息,返回一条短信到指定号码。
[查看全文]
[更多相关文章]
[解决遗留问题]