Search code examples
javacomgpsencodenmea

JAVA - GPS RECEPTOR sending strange/encoded frames in console


I have a GPS receptor, which send me NMEA frames. My code retrieve these ones, but in a really strange form :

enter image description here

I am using PuTTY to see the NMEA frames received by my receptor, and there is no problem.

enter image description here

EDIT - Here is the code I am using :

public class GPSFrame extends Observable implements Runnable
{
    static Thread myThread=null;
    static BufferedReader br;
    static BufferedWriter wr;
    static PrintWriter out;
    static InputStreamReader isr;
    static OutputStreamWriter osw;
    static java.io.RandomAccessFile port; 


    /**  CONSTRUCTOR **/
    public  GPSFrame()
    {    
         myThread=new Thread(this);
    }

    public void start()
    {
        try 
        {
            port=new java.io.RandomAccessFile("COM5","rwd");
            port.writeBytes("\r\n");
            port.writeBytes("c,31,0,0,5\r\n");
            port.writeBytes("T,1000,1\r\n");
        }
        catch (Exception e){ System.out.println("start "+e.toString()); }
        // The thread start automatically run() method
        myThread.start();
    }

/**********************************************************************************************
 *************************** RETRIEVE GPS FRAMES AND SEND TO SERVEUR **************************
 **********************************************************************************************/
    public void run() 
    {
        System.out.println("lecture COM...");
        // INFINIT LOOP - GPSFrame is always listening for the GPS receptor
        for(;;)
        {
            String st = null;
            try 
            {
                st=port.readLine();
                String[]gpsframe=st.split(",");

                /* IMPORTANT - DON'T FORGET SETCHANGED() or GPSFrame'll never
                 * notify UPDATE() ServerBoard method - We'll never see any changes */
                setChanged();
                notifyObservers(st);

            } 
            catch (IOException e){ System.out.println(e.getMessage()); }
            // Show in console
            System.out.println(st);
        }
    }   
}

EDIT :

When I first read GPS Frames with PuTTY then launch my application, I can see correct GPS Frames in console. But when I try to read the GPS Frame with my application first, I have encoded Frames.

I don't know why I can't retrieve the frames in this form. Can someone guide me to resolve this problem please ?

Thanks to you in advance !

Regards,

Tofuw


Solution

  • I've found a solution for my problem ! :D

    My code is a little problematic because I used RandomAccessFile to read on my COM Port. With this method I can read the frame sended by the receptor, but not properly. The solved it, I have to CONFIGURE the COM PORT, which is not possible with RandomAccessFile.

    I did a configuration test :

    • With DATABITS_5 or DATABITS_6, I received these sort of frame :

      $%() :2 ")1"2

    • But with DATABITS_7 or DATABITS_8, I received good frame :

      $GPRMC,100409.000,A,4858.018,N,00150.999,E,0.0,0.0,201213,0.0,W*70 $GPGGA,100409.000,4858.01754,N,00150.99913,E,1,15,0.7,034.93,M,47.2,M,,*66

    I think by default, Databits or configured with 5 or 6. It depends. That is why it is better configure up ourselves the Port.

    The way (or one of the way ?) to configure the COM Port, is to use SerialPort.

    Here is a solution which is really helpfull (in this example we are reading data with an event mode, but you can use the flow mode - please see the 2nd links below for it) :

    public class GPScom implements SerialPortEventListener
    {
        private String portcom;
        private CommPortIdentifier portid=null; 
        private SerialPort serialport; 
        private BufferedReader fluxgps; // Reading flow port where the GPS is connected
    
            public static void main(String[]args)
        {
            // Driver initialization
            Win32Driver driver=new Win32Driver();
            driver.initialize();
    
            GPScom gpscom=new GPScom();
            gpscom.listPort();
        }
    
        // Scanning all available ports
        public void listPort()
        {
            Enumeration listport=CommPortIdentifier.getPortIdentifiers();
            int typeport;
            String GPSPortCOM;
    
            while(listport.hasMoreElements())
            {
                portid=(CommPortIdentifier)(CommPortIdentifier)listport.nextElement();
                if(portid.getPortType()==CommPortIdentifier.PORT_SERIAL)
                {
                    System.out.println("Port Name : "+portid.getName());
                    System.out.println("User : "+portid.getCurrentOwner());
                    System.out.println("Use ? : "+portid.isCurrentlyOwned());
                    System.out.println("Port type : "+portid.getPortType());
    
                    this.ModeEvenement(portid.getName());
                }
            }
        }
    
        // Initialization of the port
        public void ModeEvenement(String portcom)
        {
            // Retrieve ID Port
            try{portid=CommPortIdentifier.getPortIdentifier(portcom);}
            catch(NoSuchPortException e){System.out.println(e);}
    
            // Open Port
            try{serialport=(SerialPort)portid.open("ModeEvenement",2000);}
            catch(PortInUseException e){System.out.println(e);}
    
            // Retrieve data flow
            try{fluxgps=new BufferedReader(new InputStreamReader(serialport.getInputStream()));}
            catch(IOException e){System.out.println(e);}
    
            // Add listener
            try{serialport.addEventListener(this);}
            catch(TooManyListenersException e){System.out.println(e);}
    
            // Configure Port
            serialport.notifyOnDataAvailable(true);
            try{serialport.setSerialPortParams(4800, SerialPort.DATABITS_6, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);}
            catch(UnsupportedCommOperationException e){System.out.println(e);}
    
            System.out.println("Port is open, waiting for the reading");
        }
    
        // Here we are reading 7 frames for test
        public void ReadSerialPort()
        {
            int i=7;
            String reponse=new String();
    
            try
            {
                System.out.println("i="+i);
                while(i!=0)
                {
                    System.out.println("Reading the COM port \n");
                    reponse=(String)fluxgps.readLine();
                    System.out.println(reponse);
                    i--;
                    System.out.println("i="+i);
                }           
            }
            catch(IOException e){System.out.println(e);}
    
            // On ferme le flux de lecture
            try{fluxgps.close();}
            catch(IOException e){System.out.println(e);}
    
            serialport.close();
        }
    
        public void serialEvent(SerialPortEvent event)
        {
            // We are only reading data if available
            switch(event.getEventType())
            {
                case SerialPortEvent.DATA_AVAILABLE:
                    this.ReadSerialPort(); // Launching the reading if data are available
                    break;
                default:
                    break; // Else, do nothing
            }
        }   
    }
    

    This is where I found this solution (/!\ French sites :D ):

    I hope it will help you if you encounter the same problem as me

    Have a nice day !!!

    Tofuw

    PS : Thanks to Aphex and AlexWien who helped me