服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

palm j2me串行通讯程序编写与调试


  palm是3com公司的产品,其操作系统palmos是一种32位的嵌入式操作系统。palm硬件提供了标准串行通讯接口(rs232接口)和红外线传输接口。利用它可以方便地与其它外部设备通讯、传输数据。目前3com公司与sun公司积极合作,已经提供了非常完善的嵌入式java(j2me),并提供了cldc1.03和palm相应的配置。基于palmos平台的java虚拟机为kvm,此虚拟机中已经提供了完善的对palm串行通讯口读写的sdk程序开发包。利用该开发包可以方便地开发palm与外围设备的串行通讯的应用程序。
  
  串行通讯历来是计算机软件界经久不衰的应用与研究内容之一。计算机串行通讯系统因为利用的外围硬件少,通常传输距离为15米,如果配合光电转换器,可将传输距离延长至若干公里。如果通讯双方使用modem,再配合电话线,就可以使在任意位置的通讯双方实现串行通讯。串行通讯被广泛地应用在工业数据采集、ic卡读写等领域。由于palm程序的编写与调试步骤与台式pc机不同,所以一些与palm串行通讯的设备必须拿到室外才能正常使用。如gps的接收机、gps的全球定位系统、gps的接收设备等,它们必须在室外,并且必须在较开阔的位置才能接收到足够的卫星数目,gps接收机才能解算出当前的位置。然后,需要通过gps接收机的串行通讯口将解算出的结果按照nmea0183协议将数据发送出去,并实现定位。这就使得palm串行通讯程序调试起来非常复杂。
  
  笔者从事j2me嵌入式程序开发1年有余,找到了一套较高效的编写和调试palm j2me嵌入式程序的方法,以下将详细介绍。
  
  palm串行通讯应用程序的开发步骤
  
  通常palm应用程序的开发是利用台式pc编写,编写后编译成palm应用程序,然后将其导入到台式pc的palm模拟器中运行调试。程序调试完成后,通过台式pc与palm的同步软件(hotsync)导入到真正的palm硬件,从而实现应用程序在palm硬件上的运行(见图1)。
   palm j2me串行通讯程序编写与调试(图一)
  图1 palm应用程序开发步骤uml活动图
  
  palm串行通讯的硬件环境
  
  由于palm串行通讯涉及到对硬件的操作,所以单纯地利用palm模拟器无法调试palm串行通讯程序,必须采用软件与硬件相结合的方法才可以。方法如下:
  
  首先将palm模拟器的串行通讯口映射到台式pc的物理串行通讯口。具体操作为鼠标右击palm模拟器,选择setting,然后选择properties,再选择serial port,最后选择com1。注意此串行通讯口设备必须未被其它设备使用。随后使用9针的d型串行通讯接口将pc物理通讯端口与palm相通讯的设备连接一起。
  
  当在同一台pc上完成palm模拟器与pc串行通讯时,需要制作一根null modem串行通讯电缆,详细制作可参照相关串行通讯资料。
  
  串行通讯辅助调试软件
  
  终端仿真程序是windows 9x/nt/2000自带的应用软件,是功能强大的串行通讯辅助调试软件,利用它可以方便地完成pc计算机之间的串行通讯。我们在此介绍终端仿真程序,并不是单纯地为了介绍windows系统自带的软件,而主要是为了调试串行通讯程序。
  
  终端仿真程序位于windows工具“开始-程序-附件-通讯-超级终端”。如果系统中尚未安装超级终端程序,请选择“控制面板-添加删除程序”,选择windows,选择通讯,选中超级终端复选项,然后按照提示插入windows 9x/nt/2000系统安装光盘,完成终端仿真程序的安装。
  
  启动超级终端程序hpertrm.exe,选定串行通讯端口(com1或com2),然后设定好通讯速率与校验位。例如串行通讯速率为9600波特,数据位为8位,无奇偶校验,停止位为1位(见图2、图3)。
   palm j2me串行通讯程序编写与调试(图二)
  图2 超级终端串行通讯端口设定
   palm j2me串行通讯程序编写与调试(图三)
  图3 超级终端串行通讯速率设定
  palm j2me串行通讯程序设计举例
  
  一般来说,串行通讯的双方都必须遵守相同的通讯数据格式,编写各自的通讯程序。由于通讯程序的编写涉及到通讯的双方,所以任意一方通讯程序的错误都将导致通讯的失败,也将给编写和调试通讯带来许多困难。笔者通过反复试验发现,利用windows终端仿真通讯程序模拟通讯双方中一方,然后调试通讯双方中另一方与windows终端仿真通讯,当通讯两方都与windows终端仿真调试成功后,即可实现它们之间的串行通讯了。这样可以最大限度地减少串行通讯程序的调试工作量,提高程序开发速度(见图4)。假设目前要设计两个串行通讯系统,分别是pc机显示palm数据系统和palm显示pc端数据系统,它们的具体实现如下:
   palm j2me串行通讯程序编写与调试(图四)
  图4 串行通讯uml关系图
  
  pc机显示palm数据系统
  
  将palm的数据库内容通过串行通讯,按照串行通讯9600波特速率、数据位为8位、无奇偶校验、停止位为1位传送到pc计算机,并显示。此系统涉及到palm端程序和pc计算机端程序。
  
  1. palm端程序(见图5)
   palm j2me串行通讯程序编写与调试(图五)
  图5 palm端程序uml状态图
  
  palm端程序主要分三步:
  
  (1)打开palm内部数据库,设palm内部的数据库的标识为:
  
  dbtype=gpsd,creatorid=6657;
  static int dbtype = 0x67707364; // gpsd
  static int dbcreator = 0x36363537; // '6657'
  database db = new database(dbtype, dbcreator, database.readonly);
  ......
  
  由于不涉及到对数据库的写操作,所以这里以只读的方式打开palm内部数据库。
  
  (2)打开palm串行通讯端口,构造serialport对象,使用serialport.open方法打开串口。
  
  protocol serialport = new protocol();
  serialport.open("0;baudrate=9600;bitsperchar=8;stopbits=1;parity=none;autorts=off;autocts=off;blocking=off",1, true);......
  
  (3)发送数据,通过serialport对象的openoutputstream()方法,获取outputstream数据流,并赋给os对象,代码为outputstream os = serialport.openoutputstream()。然后,读取palm内部数据库gpsd的每条记录内容,将内容按字节通过串行通讯传送到pc,并通过os.write(),将数据写入串口。主要代码为:
  
  byte [] rnl={13,10};
  for (int i=0;i   {
   graphics.getgraphics().drawstring("send record no."+i,30,100);
   os.write(db.getrecord(i));
   os.write(rnl);
   }
  os.flush();
  ......
  
  如果串行通讯数据传输完毕,关闭串行通讯端口和palm内部数据库。代码如下:
  
  system.out.println("send finished!");
  os.close();
  system.out.println("connection closed.");
  ......
  
  将此程序编译、安全校验、封装成palm格式的prc应用程序,然后传送到palm模拟器上。将palm模拟器的串行通讯端口映射为pc的com1通讯端口,使用windows自带的终端仿真程序模拟pc来完成串行通信。启动windows自带的终端仿真程序,设置其使用端口为com2,设定串行通讯速率为9600波特、数据位为8位、无奇偶校验、停止位为1位,然后使用null modem串行通讯电缆将pc的com1和com2端口物理连接。
  运行上述palm程序可以发现,palm模拟器通过串行通讯将内部数据传送到windows自带的终端仿真程序的对话窗口中了。由于该对话窗口只能保存500行的对话内容,所以如果大于500行,可以选择windows超级终端的“传送”菜单,选择捕获文本,将对话内容直接保存到一个标准的文本文件中。
  
  2. pc端串行程序(见图6)
  palm j2me串行通讯程序编写与调试(图六)
  图6 pc断程序uml状态图
  
  可以将pc端串行程序看为类似超级终端的应用程序。pc端串行程序完成的工作主要有,按照设定的传输速率(必须与palm端的串行通讯参数一致)打开串行通讯端口,然后启动线程,并且监听串行通讯端口数据。接收到数据后,将数据显示。具体程序步骤如下:
  
  (1)安装好sun java 串行通讯sdk类库,在程序中引入相应的类,代码为import javax.comm.*。然后采用循环枚举的方法,判断读取pc机上的串行通讯口的状态(此处通讯口是com2),代码如下:
  
  static enumeration portlist;
  portlist = commportidentifier .getportidentifiers();
  while (portlist.hasmoreelements()) {
   portid = (commportidentifier) portlist.nextelement();
   if (portid.getporttype() == commportidentifier.port_serial) {
   if (portid.getname().equals("com2")) {
  reader reader = new reader();
   }
  .....
  
  (2)打开串口,获取串行通讯数据流,代码如下:
  
  public reader() {
   try {
   serialport = (serialport) portid.open("li", 2000);
   } catch (portinuseexception e) {}
   try {
   inputstream = serialport.getinputstream();
   } catch (ioexception e) {}
  
  (3)在serialporteventlistener事件中,判断是否串口有数据到来,如果有就将数据显示出来,代码如下:
  
  public void serialevent(serialportevent event) {
   switch(event.geteventtype()) {
   case serialportevent.bi:
   case serialportevent.oe:
   case serialportevent.fe:
   case serialportevent.pe:
   case serialportevent.cd:
   case serialpo

扫描关注微信公众号