NMEA GPS设备(串口)扫描实例 GPSSerialPortScaner

NMEA GPS设备(串口)扫描实例 GPSSerialPortScaner
1.Library:RXTXComm.jar



/*

 * GPSSerialPortScaner.java
 * Copyright (C) 2009  <[email protected]>
 *
 *        This program is free software; you can redistribute it and/or modify
 *        it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *     (at your option) any later version.
 *
 *       This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *        GNU General Public License for more details.
 *
 
*/
package  org.lambdasoft.serial.gps;
import  gnu.io.CommPort;
import  gnu.io.CommPortIdentifier;
import  gnu.io.PortInUseException;
import  gnu.io.SerialPort;
import  gnu.io.UnsupportedCommOperationException;

import  java.io.InputStream;
import  java.util.Enumeration;

import  org.lambdasoft.ui.dialog.BubbleDialog;
import  org.lambdasoft.ui.systray.statusbar.StatusBar;
import  org.lambdasoft.util.StringUtils;

/**
 * 
@author  lei.tang ([email protected])
 * @date 2010-3-8
 * 
@version
 
*/
public   class  GPSSerialPortScaner {
    
private   static  GPSSerialPortScaner finder;
    
private   static   final   int  SCANTIME  =   2000 ;
    
private   static   final   int [] PORTSPEED  =   new   int []{ 4800 , 9600 };
    
private  GPSSerialPortScaner() {}
    
    
public   static  GPSSerialPortScaner getScaner() {
        
if (finder  ==   null )
            finder 
=   new  GPSSerialPortScaner();
        
return  finder;
    }

    
public  String scan() {
        BubbleDialog.getBubble().display(
" GPS设备自动搜索中 " , false , false );
        
for  ( int  speed : PORTSPEED) {
            String port 
=  scan(speed);
            
if (StringUtils.isNotEmpty(port))
                
return  port;
        }
        
return   null ;
    }
    
    @SuppressWarnings(
" unchecked " )
    
public  String scan(Integer speed) {
        StatusBar statusBar 
=  StatusBar.getBar();
        Enumeration
< CommPortIdentifier >  commons  =  CommPortIdentifier.getPortIdentifiers();
        CommPortIdentifier com 
=   null ;
        CommPort serialPort 
=   null ;
        
while  (commons.hasMoreElements()) {
            com 
=  commons.nextElement();
            
if (statusBar  !=   null )
                statusBar.setGPSInfo(
" 扫描GPS设备: "   +  com.getName()  +   "  扫描速率: "   +  speed);
            
try  {
                serialPort 
=  com.open( " PortOpener " 10 );
            } 
catch  (PortInUseException piue) {
                serialPort 
=   null ;
                
continue ;
            }
            
if  (com.getPortType()  ==  CommPortIdentifier.PORT_SERIAL) {
                SerialPort sp 
=  (SerialPort) serialPort;
                
try  {
                    
//  Settings for B&G Hydra
                    sp.setSerialPortParams(speed.intValue(), SerialPort.DATABITS_8,
                            SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
                } 
catch  (UnsupportedCommOperationException ucoe) {
                    serialPort 
=   null ;
                    
continue ;
                }
            }
            
try  {
                InputStream input 
=  serialPort.getInputStream();
                
int  readChar  =   - 1 ;
                
long  currentTime  =  System.currentTimeMillis();
                
while ((System.currentTimeMillis()  -  currentTime)  <=  SCANTIME) {
                    
if ((readChar  =  input.read())  ==   - 1 ) {
                        
continue ;
                    }
                    
if (( char )readChar  ==   ' $ ' ) {
                        StringBuilder builder 
=   new  StringBuilder();
                        
for  ( int  j  =   0 ; j  <   5 ; j ++ ) {
                            builder.append((
char )(input.read()));
                        }
                        String head 
=  builder.toString();
                        
if (head.equals( " GPGGA " )) {
                            serialPort.close();
                            
if (statusBar  !=   null ) {
                                String successMsg 
=   " GPS设备在端口 "   +  com.getName()  + " 初始化成功,速率:  "   +  speed;
                                BubbleDialog.getBubble().display(successMsg,
false , true );
                                statusBar.setGPSInfo(successMsg);
                            }
                            
return  com.getName();
                        }
                    }
                }
            } 
catch  (Exception e) {
                
return   null ;
            }
            serialPort.close();
        }
        
if (serialPort  !=   null )
            serialPort.close();
        
return   null ;
    }
}

你可能感兴趣的:(NMEA GPS设备(串口)扫描实例 GPSSerialPortScaner)