技术天地

基于ARM9工控主板的SMS短信息应用    发布时间:2011/1/27    被阅览数:

  英创公司的嵌入式工控主板均预装WinCE5.0正版操作系统,在工业控制及终端检测设备中,具有低成本、低功耗、小尺寸等优势。在现在的工业应用中,利用GSM无线信道进行数据通讯的无人值守及无线数据传输的应用越来越广泛,其中主要以GPRS数据通讯及SMS短信息方式为主。GPRS数据通讯是以TCP/IP方式进行通讯,GPRS模块发送SMS短信,是通过串口发送AT指令来实现。

  英创公司基于ARM9工控主板,完善了GPRS模块发送短信息的应用方案。本文以EM9161+ETA300为例,说明SMS短信息的使用方法。

  英创公司对短信收发的操作函数封装为类SMS,该类是基于串口类CCESerial派生的新类,并在基类中定义了虚函数PackagePro(),在SMS中重新实现该函数来处理SMS短信收、发的相关AT指令,并对所使用到的变量进行操作,且用户可以根据自己不同的需求,重新实现该函数。该函数是SMS短信收发过程中主要的功能函数。SMS类定义的主要成员及使用到的数据结构如下:

  struct SMS_DATA
  {
    unsigned char PhoneNum[16]; // 对端电话号码
    struct Date d; // 日期:年月日
    struct Time t; // 时间:时分秒
    int DatLen; // 数据长度
    unsigned char DBuf[168]; // 短信数据内容
  };
  // 基类的PackagePro()函数的重新实现
  // 主要作用是处理短信收发相关的AT指令
  int PackagePro( char* Buf, int len );
  // GPRS模块的SMS工作模式的初始化
  // 主要是发送AT指令设置GPRS模块工作参数
  int InitSMSModem( );
  // 通过GPRS模块发送短信息
  // return = 0: SMS-SUBMIT ok!
  //        < 0: SMS-SUBMIT is rejected
  int SendMessage( struct SMS_DATA* pSMS );

  对于用户来说,使用SMS类来发送短信,仅执行几个步骤即可。下面则按次序对使用该类SMS来发送短信息的方法进行说明。(例如:用户程序中实例化了一个对像:class SMS MySMS;  )

1、对GPRS模块进行上电

  EM9161管理GPRS模块的电源,使用的是GPIO8和GPIO9两条引脚,按照GPRS电源管理要求的时序进行IO操作,即可实现对GPRS模块的电源进行控制。英创公司写好了相关的操作函数GPRS_PM()在EM9161_ISA_DIO.h中,其描述如下:

  // 功能描述:该函数通过对EM9161的GPRS_STB和GPRS_AUX两个管脚信号的操作,实现对GPRS模块
  //           (MC39i或兼容模块)的电源管理。
  //
  // 输入参数 OpMode: 电源管理功能索引号,有效索引号包括:
  //                  OpMode = 1: 对GPRS模块进行上电操作,并把执行该操作后电源状态返回;
  //                  OpMode = 2: 对GPRS模块进行强制关电,并把执行该操作后电源状态返回;
  //                  OpMode = 3: 读取GPRS模块当前的电源状态。
  //
  // 输出参数 pResult: 用于存储读取的电源状态信息。
  //                   *pResult = 0: 表示GPRS模块的电源已关闭;
  //                   *pResult = 1: 表示GPRS模块的电源已加载成功;
  //
  // 返回值 = FALSE:操作失败。
  //          TRUE: 操作正确。
  BOOL GPRS_PM( int OpMode, int* pResult );

  调用GPRS_PM()函数对GPRS模块进行上电。由于GPRS模块上电后,还要检测SIM卡是否在线及信号强度是否可用,所以会占用相当长的时间,建议在GPRS模块上电成功后,延时10秒钟时间再进行下面的操作。

2、打开GPRS模块所占用的串口

  MySMS.OpenPort( 2, 57600 , 'n' , 8 , 1 ); //在这里,直接调用SMS类继承//过来的成员OpenPort()函数,其实,这里是调用的基类的成员函数,即CCESerial的OpenPort()。

3、初始化SMS短信模块

  MySMS.InitSMSModem();

4、填写要发送的手机号及数据

  如:要发送信息“英创嵌入式:WinCE!”到13800000000号码
  struct  SMS_DATA  SendData; // 定义一个发送数据的数据结构
  SendData.PhoneNum=”13800000000”; // 填写接收短信的手机号
  SendData.DBuf=”英创嵌入式:WinCE!”; // 填写要发送的数据。

5、启动发送

  MySMS.SendMessage( &SendData ); // 启动短信发送

6、关闭GPRS模块连接的串口

  当不用GPRS发送短信时,需要关闭对应的串口。
  MySMS.ClosePort(); // 关闭GPRS模块所占用的串口

  在SMS类直接支持中文短信的发送,所以短信发送的模式均采用PDU模式。对于中文字符,在短信发送时还需要转换为unicode码,程序代码中已经实现了中文内码到unicode 码的自动转换,客户在测试该程序时,需要注意的是要将unicode 的相关的3个转换文件复制到系统的/nandflash中。

  gsm0338.bin
  gb2312.bin
  unicode.bin

  本文所示的例程仅在英创公司的ARM系列嵌入式主板上可用,如需该方案的源码,请与英创公司联系。

Go Top