注册名:

密码:

个人注册

企业注册

商务申请

商务管理平台

企业管理平台

个人管理平台

我的工控博客

中国工控网www.chinakong.com

首页 | 新闻中心 | 工控论坛 | 经验视点 | 工控商务 | 电气手册 | 工控博客 | 招聘求职 | 网上调查 | 企业中心 | 供求信息 | 资料中心 | 工控书店

所在位置:工控论坛 -- 行业技术论坛 -- 行业技术论坛(非专题) -- 工艺技术

中国工控网搜索:

 登陆:密码:  注册  密码

搜索:

行业技术论坛(非专题)分类  

全部论题

工艺技术

行业标准

机械装备

技术经验

发表人:emtronix 发表时间:2011/1/17 0:40:00  

 

 本栏论题: 短信控制的低成本监控单元  [1531]

    本文介绍一种低成本的、支持中文短信的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通道可以直接应用于串行口通信,这样不仅保证了

如果要回复本栏论题,请首先中国工控网www.chinakong.com

·如果你已经是中国工控网www.chinakong.com成员,请直接登录。

·如果你还不是中国工控网www.chinakong.com成员,请首先注册,注册为免费!

注册名:

密  码:

           注册中国工控网www.chinakong.com
           忘记密码

关闭该窗口

关于我们     免责声明     服务项目     广告联系     友情链接     联系方式     意见反馈     设为首页     加入收藏

 ©2023-2025 中国工控网(www.chinakong.com) 版权所有 豫ICP备17046657号

管理员信箱:chinakong98@163.com  服务热线:13525974529

洛阳博德工控自动化技术有限公司

中国    洛阳