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