首页产品库评测行情新闻|手机数码笔记本台式机DIY硬件数字家庭数码相机办公外设|软件下载游戏开发|社区

更多

数码相机
MP4
LCD
机箱
音箱

天极网 > 开发频道>Palm编程实现GPS数据读取

Palm编程实现GPS数据读取

2004-05-13 12:33作者:李鲁群出处:cnemb责任编辑:方舟

  3 PDA与GPS通讯的NMEA协议

  GPS即全球定位系统,它主要有三大组成部分,即空间星座部分、地面监控部分和用户设备部分。其中GPS空间星座部分、地面监控部分均为美国所控制;GPS的用户设备主要由接收机硬件和处理软件组成。用户通过用户设备接收GPS卫星信号,经信号处理而获得用户位置、速度等信息,最终实现利用GPS进行导航和定位的目的。目前许多GPS厂商遵循NMEA0183协议针对PDA掌上电脑开发许多导航型GPS。这些GPS提供串行通讯接口,串行通讯参数为:

<CODE>波特律=4800 数据位=8位 停止位=1位 无奇偶校验</CODE>

  GPS与掌上电脑通讯时,通过串口每秒钟发送10条数据。实际导航应用读取GPS的空间定位数据时,我们可以根据需要每隔几秒钟更新一次经纬度和时间数据。而更频繁的数据更新就没有必要了,而且会白白浪费Palm掌上设备有限的电池。我们不需要了解NMEA 0183通讯协议的全部信息,仅需要从中挑选出我们需要的那部分定位数据。其余的信息我们忽略掉。 

  如果此时和卫星的通讯正常的话,可以接收到的数据格式样如下:

<CODE>$GPRMC,204700,A,3403.868,N,11709.432,W,001.9,336.9,170698,013.6,E*6E</CODE>

  数据说明如下:

   $GPRMC 代表GPS推荐的最短数据

   204700 UTC_TIME 24小时制的标准时间,按照小时/分钟/秒的格式

   A A 或者 V A表示数据"OK",V表示一个警告

   3403.868 LAT 纬度值,精确到小数点前4位,后3位N LAT_DIR N表示北纬,S表示南纬

   11709.432 LON 经度值,精确到小数点前5位,后3位W LON_DIR W表示西经,E表示东经

  如果当前没有和卫星取得联系,那么字符串的格式为:

  $GPRMC,UTC_TIME,V,...  

  下面是一个例子: 

   $GPRMC,204149,V,,,,,,,170698,,*3A

  4 J2ME 串行读写GPS数据的实现

  Palm的J2ME对GPS串口数据读写可以采用两种方式,一种是采用对串口采用原始单个字节数据读写,另一种采用缓冲区字节数组读写。(注意:J2ME为Palm提供的KVM的1.0版本不支持串行通讯速率4800波特,GPS串行通讯速率为4800波特,必须采用CLDC1.02以上版本或KAWT提供的Color KVM)

  在实际Palm对串口GPS数据读写实验中,我们发现前者效率低、读写速度慢,平均每3-7秒才能读取到所需的GPS定位数据,而后者读写速度快,可以每秒读到所需的GPS数据,没有GPS数据丢失。所以,在此仅介绍后一种GPS的读取方式。

  J2ME和Palm Profile中已经提供了对串口读写的类Protocol,通过构造Protocol实例serialPort,利用serialPort.openInputStream()获得输入流InputStream,利用InputStream将GPS串口数据读入到一个缓冲区字节数组,将字节数组转化为字符串,判断GPS坐标标志"$GPRMC",截取坐标数据。


图2 Palm对GPS读取UML协作图

  见源程序PrintMe.java

<CODE>package earth_survy;
import java.util.*;
import javax.microedition.io.*;
import java.io.*;
import com.sun.kjava.*;
import com.sun.cldc.io.palm.comm.*;
public class GetGpsData extends Spotlet {
 static Graphics g=Graphics.getGraphics();
 static Protocol serialPort = new Protocol();
 static String url="0;baudrate=4800;bitsperchar=8;stopbits=1;parity=none";
 static InputStream is;
 // Open the serial Port for Gps Data Input
 public boolean openPort(){
  try {
   serialPort.open(url,1, true);
   is=serialPort.openInputStream();
   return true;
  }
  catch (Exception ex) {
   return false;
  }
 }

 file://Close the serial Port

 public boolean closePort(){
  try {
   is.close();
   serialPort.close();
   return true;
  }
  catch (Exception ex) {
   return false;
  }
 }

 file://Read the GPS data
 file://Mark is "$GPRMC
 file://rdLen is the buffer length
 file://getlen is the return lenth;

 public String readGpsData(String mark,int rdlen,int getlen){
  byte[] readBuffer = new byte[rdlen];
  String rawGpsData;
  String Gprmc;

  while (true){
   try{
    file://Read raw GPS data into a buffer;
    is.read(readBuffer);
    rawGpsData=new String(readBuffer);
    file://determin the positon of the Mark==> $GPRMC;
    int pos=rawGpsData.indexOf(mark);
    if (pos>-1)
    {
     Gprmc=rawGpsData.substring(pos);
     if (Gprmc.length()>getlen)
     {
      Gprmc=Gprmc.substring(0,getlen);
      break;
     }
    }    
   }
   catch(Exception e){
   }
  }
  return Gprmc;
  //end loop
 }//end method
}</CODE>
共2页。 9 7 1 2

关注此文的读者还看过:

返回开发频道首页

共2页。 上一页12

软件频道最新更新

热点推荐

天极服务|关于我们|About us|网站律师|RSS订阅|友情合作|加入我们|天极动态|网站地图|意见反馈|MSN/QQ上看天极
Copyright (C) 1999-2012 Yesky.com, All Rights Reserved 版权所有 天极网络