中国·芯片交易在线
首页 | 供应信息 | 求购信息 | 库存查询 | 新闻中心 | 展会资讯 | IC厂商 | 技术资料 | 自由区域
   新闻首页 |  行业动态 | 新品发布 | 政策法规 | 科技成果 | 模拟技术 | 嵌入系统 | 传感控制 | 存储设计  
当前位置:IC72首页>> IC新闻中心>> 嵌入系统 >>电子行业新闻正文

WinCE系统下GSM Modem的测控应用

时间:2008/8/4 17:41:00  作者:  来源:IC72  浏览人数:1386
 
 

      引言

      许多时候,我们需要了解远距离的某个工作现场的某些工作参数,或者对某些工作指标进行控制(开、关控制)。例如,需要了解远距离无人职守的发射机的功率情况,需要开启或关闭高山上电视塔的灯光,等等。这些一般都是通过基于C/S或者B/S等的网络手段来实现的,需要专门的网络线路和监控端软硬件的支持,构筑这样的应用系统投资一般都比较大,监控方位置的灵活度也被局限于有监控端软硬件的环境中。这里介绍一种在嵌入式WinCE系统下利用GSM Modem,用普通电话(包括手机,下同)就可以实现远程监控的方法。不需要有专用的监控端软硬件的支持和其他专用的网络线路,借助GSM的无线通信网络,投资大大缩小;监控方的位置可以处在任何有电话的地方,方便灵活。监控操作的选择由电话的按键来实现,监测到的参数通过语音的方式反馈到监控方的电话上;可以满足大多数远程监控应用场合的要求。

      1  应用系统架构

      本系统主要由GSM移动通信网、GSM Modem、以S3C2410为核心的硬件和WinCE系统组成,如图1所示。

ic72新闻中心

      需要监测的参数或需要控制的指标通过某种方式与嵌入式系统构成上、下位采集与控制体系。嵌入式系统发出测控指令,可以实现对现场相应数据的采集和控制。采集到的现场数据以数据文件形式保存在嵌入式系统上。目前,有关嵌入式系统对下位现场的具体采集与控制操作介绍的文献很多,这里不再复述。

      2  嵌入式系统受监控端软件设计

      嵌入式系统中受监控端软件是本监控系统的核心。它一方面管理GSM Modem识别远程电话的控制指令(按键识别)、向电话反馈对应的语音数据,另一方面还要根据远程电话的指令完成对下位现场的测控。

      2.1  串行口及GSM Modem的初始化

      根据GSM Modem连接的串行口,comID用

      hSerial=CreateFile(TEXT ("comID"),GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING, 0, NULL);

      打开该串行口。根据返回句柄hSerial的值,可以判断打开是否成功。由“GetCommState(hSerial,&dcb);”获得comID的状态,同时自动填入不用的DCB结构成员。再用“SetCommState(hSerial,&dcb);”就可以初始化该串口了。之前,&dcb要设置自己的参数,如:

      dcb.BaudRate=115200;

      dcb.ByteSize=8;

      dcb.Parity=NOPARITY;

      dcb.StopBits=ONESTOPBIT;//依次为波特率、数据位、奇偶校验位和停止位

      SetupComm(hSerial,1024,1024);//设置收发缓冲区大小//超时控制设置

      Timeouts.ReadIntervalTimeout=1;

      Timeouts.ReadTotalTimeoutMultiplier=1;

      Timeouts.ReadTotalTimeoutConstant=10;

      Timeouts.WriteTotalTimeoutMultiplier=1;

      Timeouts.WriteTotalTimeoutConstant=10;

      SetCommTimeouts(hSerial,&Timeouts);

      SetCommMask(hSerial,EV_RXCHAR);//挂接接收事件

      最后用“ WriteFile(hSerial,szBuffer,strlen(szBuffer),&dwBytesWritten,&os_w);”向串口写入GSM Modem的初始化数据(AT命令)。不同的GSM Modem其AT命令可能有所不同(可以从GSM Modem的用户手册中获得)。笔者使用的GSM Modem的初始化数据为“ats0=1+fclass=8”、“at+vsm=128,11025”。

      2.2  按键识别

      因为监控指令是由远程电话通过电话上的按键发出的,所以在受监控端,正确识别电话的按键是非常关键的。在一个处理线程中,可以用如下程序进行识别:

      while(flag){//flag为控制值

      WaitCommEvent(hSerial,&dwEvtMask,0);

      if ((dwEvtMask&EV_RXCHAR)==EV_RXCHAR){

      ClearCommError(hSerial,&dwErrorFlags,&ComStat );

      dwLength = ComStat.cbInQue ; //输入缓冲区有多少数据

      if(dwLength>0){

      ReadFile(hSerial,buff,dwLength,&ln,&os_r);

      buff[dwLength]=0;

      if(buff[0]==0x10&&buff[1]==0x52)

      Puts(h,MEMO1,"电话拨入...");

      if(buff[1]==0x52&&buff[4]=='O'&&buff[5]=='K')

      Puts(h,MEMO1,"线路接通");

      if(buff[1]==0x2f&&buff[2]==0x10&&buff[3]==0x31)

      Puts(h,MEMO1,"1");//1键

      if(buff[1]==0x2f&&buff[2]==0x10&&buff[3]==0x32)

      Puts(h,MEMO1,"2");//2键

      if(buff[1]==0x2f&&buff[2]==0x10&&buff[3]==0x33)

      Puts(h,MEMO1,"3");//3键

      if(buff[1]==0x2f&&buff[2]==0x10&&buff[3]==0x34)

      Puts(h,MEMO1,"4");//4键

      if(buff[1]==0x2f&&buff[2]==0x10&&buff[3]==0x35)

      Puts(h,MEMO1,"5");//5键

      if(buff[1]==0x2f&&buff[2]==0x10&&buff[3]==0x36)

      Puts(h,MEMO1,"6");//6键
     
      if(buff[1]==0x2f&&buff[2]==0x10&&buff[3]==0x37)

      Puts(h,MEMO1,"7");//7键

      if(buff[1]==0x2f&&buff[2]==0x10&&buff[3]==0x38)

      Puts(h,MEMO1,"8");//8键

      if(buff[1]==0x2f&&buff[2]==0x10&&buff[3]==0x39)

      Puts(h,MEMO1,"9");//9键

      if(buff[1]==0x2f&&buff[2]==0x10&&buff[3]==0x30)    

      Puts(h,MEMO1,"0");//0键

      if(buff[1]==0x2f&&buff[2]==0x10&&buff[3]==0x23)

      Puts(h,MEMO1,"#");//#键

      if(buff[1]==0x2f&&buff[2]==0x10&&buff[3]==0x2a)

      Puts(h,MEMO1,"*");//*键

      if(buff[0]==0x10&&buff[1]==0x62)

      Puts(h,MEMO1,"拨入方已挂机");
         
       }

        }

      运行后,有电话拨入并按下567890,执行结果如图2所示。

ic72新闻中心
      
      图2  按键识别测试

      对于按键组合,可以将单个键的值依次存放到缓冲区。在程序中控制好flag的值就可以实现对按键组合的识别。

      2.3  语音传送

      将语音数据写入GSM Modem,拨入的电话一端就可以听到相应的语音。在写入语音数据之前,要先用“at+vtx”通知GSM Modem,此后的数据是语音数据。

      hf=_lopen(wavFileName,0);

      bitSize=GetFileSize((HANDLE)hf,NULL);

      _lclose(hf);

      hf=_lopen(wavFileName,0);

      _lread(hf,aa,bitSize);

      _lclose(hf);

      wsprintf(buffer,"at+vtx");

      buffer[6]=0x0d;

      WriteFile(hSerial,buffer,7,&dwBytesWritten,&os_w);

      for(i=0;i

      buffer[0]=aa[i];

      if(flag) i=bitSize;

      WriteFile(hSerial,buffer,1,&dwBytesWritten,&os_w);

        }

      其中,wavFileName为所传送的语音数据文件。

      2.4  嵌入式系统受控端整体程序描述

      嵌入式系统受控端整体程序框图如图3所示。

ic72新闻中心

      图3  嵌入式系统受控端整体程序框图

      3  语音合成技术(TTS)

      将保存在嵌入式系统上从现场采集来的数据转换成对应的语音数据,需要进行语音合成。在语音数据库中存有“ling”、“yi”、“er”、“san”……“dian”和单位名称发音的数据文件。假设要监测的是现场的电流数据,例如,下位采集来的保存到嵌入式系统上的某电流数据为5.12 A,那么就需要将“wu”、“dian”、“yi”、“er”和“an”的语音数据文件合成一个语音数据文件,以便于传送。

      BitSize位现场数据(包括小数点)语音合成的具体程序描述如下:

      hf=_lopen(DataFileName,0);//打开现场数据文件

      _lread(hf,szBuff,bitSize);//读入到缓冲区szBuff(数据是以ASCII形式存放的)

      _lclose(hf);

      for(I=0;I

      switch (szBuff[I]){

      case 0x2e:

      …//将“dian”的语音数据写入目标语音文件

      break;

      case 0:

      …//将“ling”的语音数据写入目标语音文件

      break;

      case 1:

      …//将“yi”的语音数据写入目标语音文件

      break;

      }//调整目标语音文件指针
    
      }//将单位名称的语音数据写入目标语音文件

      需要强调的是,这里用到的语音数据必须是“裸”数据,也就是去掉有关文件头的纯粹的语音数据(可以在录制单个语音文件后处理掉)。各个语音数据的大小也要记录在一个表列中,以便在调整目标语音文件指针时用到。最后生成的目标语音文件也是一个只含有“裸”数据的文件,在进行语音传送时可以直接使用。

 
【相关文章】
·WinCE系统下GSM Modem的测控应用
 
 
IC新闻搜索
 
热点新闻
基于红外超声光电编码器的室内移动小车定位系
基于闪烁存储器的TMS320VC5409DSP并行引导装载方法
非移动市场需求飙升,ARM预计2010年出货量超50亿片
一种快速响应的电容式湿度传感器感湿薄膜设计
利用特殊应用模拟开关改进便携式设计
无线传感器网络跨层通信协议的设计
基于ARM9内核Processor对外部NAND FLASH的控制实现
基于GSM技术的汽车防盗系统的设计
热电阻在烟叶初烤炕房温度控制中的应用
高速数据转换系统对时钟和数据传输的性能要求
友情连接
 关于我们  IC论坛  意见反馈  设置首页  广告服务  用户帮助  联系我们
copyright:(1998-2005) IC72 中国·芯片交易在线
(北京)联系电话:(010)82614113、82614123 传真:(010)82614123 客户服务:service@IC72.com 库存上载:IC72@IC72.com
在线MSN咨询:ic72sale8@hotmail.com 通信地址:北京市西城区西直门内大街2号大厦15层 邮政编码:100013
(深圳)联系方式: 在线MSN咨询:ic72sale6@hotmail.com 在线QQ咨询:191232636 通信地址:深圳市福田区振华路
注 册 号: 1101081318959(1-1)

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9