GPS导航数据抽取的设计与研究

时间:2011-07-09

  摘   要: 为解决盲用定位模块在嵌入式平台下实现的问题,根据串口通信同步方式实现Windows CE 5.0操作系统下GPS导航数据的提取,并对获得的数据提出一种格式转换的方法。以PXA270嵌入式系统平台实现系统原型,在有限硬件条件下验证了系统的功能及可行性。实验结果表明,该系统运行稳定,实验数据可靠有效,可以有效结合电子地图数据提取出周边的位置信息。

  Windows CE作业系统是Windows家族中的成员,专门设计给掌上型电脑(HPCs)所使用的电脑环境。这样的作业系统可使完整的可携式技术与现有的Windows桌面技术整合工作。 Windows CE 被设计成针对小型设备(它是典型的拥有有限内存的无磁盘系统)的通用操作系统,

  Windows CE 可以通过设计一层位于内核和硬件之间代码来用设定硬件平台,这即是众所周知的硬件抽象层(HAL)(在以前解释时,这被称为 OEMC (原始设备制造)适应层,即 OAL; 内核压缩层,即 KAL。 以免与微软的 Windows NT 操作系统 HAL 混淆) 。

  Windows CE 是一个开放的、可裁剪的、32位实时嵌入式窗口操作系统,具有可靠性好、实时性高、内核体积小的特点,广泛应用于各种智能式设备的开发。系统通过微软提供的Platform Builder定制需要的Windows CE5.0系统,运行在硬件平台上。硬件平台采用博创科技PXA270实验箱,该实验箱嵌入式处理器是基于ARMV5E的XscalePXA270,并支持串口通信。

  GPS导航芯片采用天宝iQ 46240,将接收到的数据通过串口发送给处理器。串口是计算机系统与外部串行设备之间的数据传输通道,是嵌入式通信可靠、通用的通信方式。程序员利用Windows API函数可以编写出高效、可移植性的应用程序。Windows CE不支持Windows下常用的串行通信异步I/O方式(Overlapped,非阻塞),因此在嵌入式环境下采用了同步I/O方式的通信程序设计方法。

  实验设计根据GPS导航数据有效性确认的标准,对提取的数据进行处理,把缓存中接收到的GPS数据格式转化为电子地图上常用的浮点型格式。此设计已应用于智能阅读器盲用定位模块中。

  1 串口通信同步I/O方式的程序设计

  串口通信是串行通信的一种,串行通信的模式一般分为上位机和下位机通信。上位机可以读取下位机的状态数据,也可以设置下位机的状态。一般串行通信协议可分为两类,即读和写。读写协议的描述如图1所示,常用的效验码有异或、累加和、CRC等[1]。

  串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信重要的参数是波特率、数据位、停止位和奇偶校验。

  在实验设计中,GPS接收装置作为下位机只负责提供固定格式的数据,实验箱作为上位机不必发送指令,只负责定时读取GPS接收装置发送的数据。即可以简化通信协议,提高工作效率。

  1.1 设计开发环境

  在Windows NT/ME环境下安装eVC4.0编程环境,设置顺序如下:

  (1)安装同步软件Microsoft ActiveSync 4.0;

  (2)安装eVC4.0;

  (3)利用PB(Platform Builder5.0)定制Wince系统对应的SDK并安装;

  (4)利用PB将定制的wince系统到实验箱上,并与PC机同步[2]。

  1.2 同步I/O方式读取的设计方法

  为完成串口通信同步I/O方式程序设计,分为三个部分,每个部分有一个函数完成其对应的功能[3]。函数原型为:

  OnOpenCom();                                          //打开并设置串口

  ReadThreadFunc(LPVOID lparam);          //串口接收线程

  OnSeriesRead(CWnd *pWnd, BYTE *buf, int bufLen);

  //串口接收数据成功回调函数

  串口接收的具体流程图如图2所示,图中对应了串口设置的三个功能函数。

  1.3 程序设计的代码实现

  1.3.1 打开并设置通信串口参数

  以同步读取方式打开串口COM1

  m_hComm=CreateFile(_T("COM1:"), GENERIC_READ|GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

  //配置串口,得到打开串口的当前属性参数,修改后再重新设置串口。

  DCB portDCB;

  portDCB.DCBlength=sizeof(DCB);            //DCB结构大小

  portDCB.BaudRate=CBR_4800;                  //波特率

  portDCB.ByteSize=8;                                     //字符位

  portDCB.Parity=NOPARITY;                     //奇偶校验位

  portDCB.StopBits=ONESTOPBIT;                      //停止位

  //设置串口读写时间,配置超时

  COMMTIMEOUTS CommTimeouts;

  GetCommTimeouts(m_hComm,&CommTimeouts);

  CommTimeouts.ReadIntervalTimeout= MAXDWORD;

  CommTimeouts.ReadTotalTimeoutMultiplier=0;

  CommTimeouts.ReadTotalTimeoutConstant=0;

  //指定端口监测的事件集

  SetCommMask (m_hComm, EV_RXCHAR);

  //分配设备缓冲区

  SetupComm(m_hComm,512,512);

  //初始化缓冲区中的信息

  PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_

  RXCLEAR);

  m_hReadCloseEvent=CreateEvent(NULL,TRUE,FALSE,

  NULL);

  1.3.2 GPS定位信息的接收

  在成功打开并设置通信口后,在主程序中创建线程函数ReadThreadFunc(LPVOID lparam):

  //创建串口接收线程

  hRecvThread=CreateThread(0, 0, CommRecvTread, this, 0, &IDThread);

  然后在线程函数中采取事件触发方式进行接收处理,通过等待EV_RXCHAR事件的发生来启动ReadFile函数完成对GPS定位信息的接收:

  while (TRUE){

  if (evtMask & EV_RXCHAR){

  ClearCommError(m_hComm,&dwReadErrors,&cmState);

  willReadLen = cmState.cbInQue ;

  //接收缓冲区中存储的待读取的字符数

  readBuf = new BYTE[willReadLen+1];

  ReadFile(m_hComm,readBuf,willReadLen,&actualReadLen,0);

  readBuf[willReadLen]=0;        //如果读取的数据大于0,

  if (actualReadLen>0){                   //触发读取回调函数        m_OnSeriesRead(ceSeries->m_pPortOwner,readBuf,actualReadLen); }}

  如果收到读线程退出信号,则退出线程

  if(WaitForSingleObject(ceSeries->m_hReadCloseEvent,500) == WAIT_OBJECT_0) break;

  2 对导航数据的格式进行处理

  对于实验中所使用的iQ46240接收芯片,其发送到计算机的数据(采用NEMA0183语句)主要由帧头、帧尾和帧内数据组成。本文中,定位数据经纬度、速度、时间等均可以从“$GPGGA”帧中获取得到。该帧的结构及各字段释义如下[4]:

  $GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10,<11>,<12>,<13>,<14>*hh

  <1>当前位置的格林尼治时间

  <2>纬度值

  <3>纬度标识,N或者S(南北)

  <4>经度值

  <5>经度标识,E或者W(东西)

  <6>卫星接收信号质量

  <7>正在使用卫星的数量

  2.1 GPS导航数据有效性确认标准

  GPS定位的基本原理是根据高速运动卫星的瞬间位置作为已知的起算数据,采用空间距离后方交会的方法确定待测点的位置。假设t时刻在地面待测点安置GPS接收机,可以测定GPS信号到达接收机的时间,加上接收机所接收到的卫星星历等其他数据可以确定以下4个方程式。卫星定位示意图如图3所示。


  其主要功能是能够捕获到按一定卫星截止角所选择的待测卫星,并跟踪这些卫星的运行。当接收机捕获到跟踪的卫星信号后,就可测量出接收天线至卫星的伪距离和距离的变化率,解调出卫星轨道参数等数据。根据这些数据,接收机中的微处理计算机就可按定位解算方法进行定位计算,计算出用户所在地理位置的经纬度、高度、速度、时间等信息。接收机硬件和机内软件以及GPS 数据的后处理软件包构成完整的GPS 用户设备。

  xi,yi,zi(i=1,2,3,4)分别代表卫星1、2、3、4在t时刻的空间直角坐标,可由卫星导航电文求得,Vti代表卫星钟差,Vt0为接收机的钟差。

  由以上4个方程式可计算出待测点的坐标x、y、z和接收机的钟差Vt0。因此导航数据能够有效计算必须保证接收到4个卫星的星历。对固定格式的导航电码中提取卫星符号进行确认,通常,3颗卫星可以在二维平面上得到经度纬度坐标,为起见,4颗卫星可以保证获得三维空间坐标。

  2.2 有效数据提取和数据格式转化

  有效数据的提取和数据格式转化都是在回调函数中进行的[5]。eVC支持CString类型格式,由于定位信息格式固定,本文先利用mbstowcs函数将缓存中的字符型数据转换为宽字符型,然后强制转化为字符串类型。

  WCHAR wszbuf[512];

  mbstowcs(wszbuf,(char*)buf,strlen((char*)buf));字符串类型进行处理,然后利用Find函数,搜索"$GPGGA",

  strRecv.Find(_T("$GPGGA"),1);

  state=strRecv.Mid(pos+37,1);

  得到GPS 质量指示指标

  strSatelliteNum=strRecv.Mid(pos+39,1) ;

  int iSatelliteNum=atoi((LPSTR)(LPCTSTR)strSatelliteNum);

  当iSatelliteNum>3&& state = =‘1’时说明接收到的是有效数据,可对strRecv中的数据进行提取,并赋给经纬度和时间变量。

  strLatitude =strRecv.Mid(pos+16,8);

  strLongitude=strRecv. Mid(pos+27,9);

  double Longitude_new = (atof(strLongitude))/100;

  这样将经度纬度信息提取到GPS结构数组中,后续的处理和高层决策可根据该结构中存储的数据作出相应的处理。

  3 程序运行结果分析

  程序运行后,在实验平台上收集的部分数据如表1所示。

  对以上结果分析,可知通过串口在不同时段接收的数据是比较稳定的,能够以此为基础提取到有效的数据和定位信息,本系统结合超图格式(pwr,pmw)的北京市公交站点地图数据,在编写程序时调用超图接口函数打开电子地图数据,将串口接收到的数据读入,得到附近的公交站点并以文本方式输出到界面。

  本文结合相关程序代码陈述了基于eVC环境下串口通信程序的设计,对GPS定位系统定位信息的接收和数据提取进行了详细的分析和讨论。主要解决了EVC编程环境下实现串口通信功能、对GPS定位信息的提取和处理的问题。实验对wince5.0自定义平台下开发GPS接收装置给出了代码样例供参考,并已应用于智能阅读器项目中盲用定位模块。


  
上一篇:实现AT89S8252排污远程监测系统
下一篇:精准农业监控系统设计与应用

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料