[API Javax Comm] Lire Port COM sur evenement

Lire Port COM sur evenement [API Javax Comm] - Java - Programmation

Marsh Posté le 24-04-2007 à 09:02:54    

Bonjour à tous!
J'utilise dans un programme java l'API javax.comm pour lire des infos venant d'un recepteur gps USB (détecté sur un port série virtuel).
Etant donné que le numéro du port COM attribué au recepteur GPS peut changer et que l'utilisateur du programme ne doit pas s'occuper de ça, je scanne tous les ports série et test si il y a des datas format NMEA (trames du recepteur GPS) qui arrivent du port COM en question. (Je n'ai pas trouver mieux!)
Donc j'essaye de faire une lecture du port série sur évènements comme dans le tutoriel :  
http://christophej.developpez.com/ [...] mm/#L2.3.3
 
J'ai juste un petit souci maintenant : j'arrive bien a trouver mon recepteur GPS mais mon prog plante une fois les trames lues! Je crois que le prog reste bloqué dans la structure switch qui gère les évènements du port série!

Code :
  1. import javax.comm.*;
  2. import java.util.*;
  3. import java.math.*;
  4. import java.net.*;
  5. import com.sun.comm.Win32Driver;
  6. import java.io.*;
  7. public class testCOM implements SerialPortEventListener {
  8.     private String portCOM;
  9.     private CommPortIdentifier portID = null; //identifiant du port
  10.     private SerialPort serialPort; //le port série
  11.     private BufferedReader fluxLecture; //flux de lecture du port
  12. /*
  13.  * Methode qui initialise le port série en evenementiel
  14.  */
  15. public void ModeEvenement(String portCOM) {
  16.  //récupération de l'identifiant du port
  17.  try {
  18.   portID = CommPortIdentifier.getPortIdentifier(portCOM);
  19.  } catch (NoSuchPortException e) {
  20.  }
  21.  //ouverture du port
  22.  try {
  23.   serialPort = (SerialPort) portID.open("ModeEvenement", 2000);
  24.  } catch (PortInUseException e) {
  25.  }
  26.  //récupération du flux
  27.  try {
  28.   fluxLecture =
  29.    new BufferedReader(
  30.     new InputStreamReader(serialPort.getInputStream()));
  31.  } catch (IOException e) {}
  32.  //ajout du listener
  33.  try {
  34.   serialPort.addEventListener(this);
  35.  } catch (TooManyListenersException e) {
  36.  }
  37.  //paramétrage du port
  38.  serialPort.notifyOnDataAvailable(true);
  39.  try {
  40.   serialPort.setSerialPortParams(
  41.    4800,
  42.    SerialPort.DATABITS_8,
  43.    SerialPort.STOPBITS_1,
  44.    SerialPort.PARITY_NONE);
  45.  } catch (UnsupportedCommOperationException e) {}
  46.  System.out.println("port ouvert, attente de lecture" );
  47. }
  48.    
  49.     /*
  50.      * Methode qui effectue la lecture de 7 trames sur le port série
  51.      * Une fois la lecture faite on ferme le flux de lecture et le port COM
  52.      */
  53.     public void ReadSerialPort(){
  54.      int i=7;
  55.      String reponse = new String();
  56.  try {
  57.   System.out.println("i="+i);
  58.   while(i!=0){
  59.    System.out.println("On lit sur le port COM\n" );
  60.    reponse = (String) fluxLecture.readLine();
  61.    System.out.println(reponse);
  62.    i--;
  63.    System.out.println("i="+i);
  64.   }
  65.  } catch (IOException e) {}
  66.  //fermeture du flux de lecture
  67.  try {
  68.   fluxLecture.close();
  69.  } catch (IOException e) {}
  70.  //fermeture du port COM
  71.  serialPort.close();
  72. }
  73. public void serialEvent(SerialPortEvent event) {
  74.  //gestion des événements sur le port :
  75.  //on ne fait rien sauf quand les données sont disponibles
  76.    switch (event.getEventType()) {
  77.   case SerialPortEvent.DATA_AVAILABLE :
  78.    this.ReadSerialPort();//si data dispo on lance la lecture
  79.    break;
  80.   default:
  81.    break;//on ne fait rien pour les autres evenements
  82.  }
  83. }
  84.    
  85.     /*
  86.      * Methode qui scanne tous les ports COM et test si des données viennent du port COm scanné
  87.      */
  88. public void listPort(){
  89.  Enumeration listePorts = CommPortIdentifier.getPortIdentifiers();
  90.  int typePort;
  91.  String GPSPortCOM;
  92.  while (listePorts.hasMoreElements()){
  93.   portID = (CommPortIdentifier) (CommPortIdentifier) listePorts.nextElement();
  94.   if(portID.getPortType()==CommPortIdentifier.PORT_SERIAL){   
  95.       System.out.println("Nom du PORT :"+portID.getName());
  96.       System.out.println("User :"+portID.getCurrentOwner());
  97.       System.out.println("Use ? :"+portID.isCurrentlyOwned());
  98.       System.out.println("Type du PORT :"+portID.getPortType());
  99.       // On lance la gestion des évènements sur portID
  100.    this.ModeEvenement(portID.getName());
  101.   }
  102.  }
  103. }
  104. public static void main(String[] args) {
  105.  //initialisation du driver
  106.  Win32Driver w32Driver = new Win32Driver();
  107.  w32Driver.initialize();
  108.  testCOM test = new testCOM();
  109.  test.listPort();
  110. }
  111. }


 
Je ne sais pas si j'ai été assez clair! Mais si quelqu'un a une idée je suis preneur!!!
Merci d'avance.

Reply

Marsh Posté le 24-04-2007 à 09:02:54   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed