Palm是3Com公司的产品,其操作系统为PalmOS。Palm OS是一种32位的嵌入式操作系统。Palm提供了串行通讯接口和红外线传输接口。利用它可以方便地与其他外部设备通讯、传输数据。Palm OS与同步软件(HotSync)结合可以使掌上电脑与PC机上的信息实现同步,把台式机的功能扩展到了手掌上。Palm应用范围相当广泛,如:联络及工作表管理、电子邮件及互联网通讯、销售人员及组别自动化、等等。Palm外围硬件也十分丰富,有数码相机,GPS接收器,调制解调器,GSM无线电话,数码音频播放设备,便携键盘,语音记录器,条码扫描,无线寻呼接收器,探测仪等许多许多。
其中Palm与GPS结合的应用,可以不但可以做导航定位,还可以结合GPS做气候的监测、地名调查等。
2.2开发工具选取
目前针对Palm环境的开发工具主要有CodeWarror C、JAVA、AppForgePersonal(Basic)等等。由于Palm平台与微机硬件、软件平台有着本质的差异,为了减少开发人员的培训费用,提高开发速度,我们采用Java语言作为系统开发工具。Java技术由三个版本组成:.Micro 微版(J2ME)、. Standard标准版(J2SE)、 Enterprise企业版(J2EE)。其中J2ME主要针对消费电子类产品(如日常用品,如微小的智能卡,机顶盒,各种手持设备等)和嵌入式设备的开发工具和运行环境。J2ME具有很多java技术特性,它可以在各种支持java的设备上运行、代码短小、安全性好、 用J2ME实现的应用可以方便地升级到J2SE, J2EE。
图1 Java技术结构图
3 PDA与GPS通讯的NMEA协议
GPS即全球定位系统,它主要有三大组成部分,即空间星座部分、地面监控部分和用户设备部分。其中GPS空间星座部分、地面监控部分均为美国所控制;GPS的用户设备主要由接收机硬件和处理软件组成。用户通过用户设备接收GPS卫星信号,经信号处理而获得用户位置、速度等信息,最终实现利用GPS进行导航和定位的目的。目前许多GPS厂商遵循NMEA0183协议针对PDA掌上电脑开发许多导航型GPS。这些GPS提供串行通讯接口,串行通讯参数为: 波特律=4800 数据位=8位 停止位=1位 无奇偶校验
GPS与掌上电脑通讯时,通过串口每秒钟发送10条数据。实际导航应用读取GPS的空间定位数据时,我们可以根据需要每隔几秒钟更新一次经纬度和时间数据。而更频繁的数据更新就没有必要了,而且会白白浪费Palm掌上设备有限的电池。我们不需要了解NMEA 0183通讯协议的全部信息,仅需要从中挑选出我们需要的那部分定位数据。其余的信息我们忽略掉。
如果此时和卫星的通讯正常的话,可以接收到的数据格式样如下:$GPRMC,204700,A,3403.868,N,11709.432,W,001.9,336.9,170698,013.6,E*6E
数据说明如下:$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>
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9403012/viewspace-1635/,如需转载,请注明出处,否则将追究法律责任。