2013-07-01 2 views
-1

J'ai ce code pour écrire et lire sur le port COM.Java javax.comm syncronous lecture

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

    import javax.comm.CommPortIdentifier; 
    import javax.comm.PortInUseException; 
    import javax.comm.SerialPort; 
    import javax.comm.SerialPortEvent; 
    import javax.comm.SerialPortEventListener; 
    import javax.comm.UnsupportedCommOperationException; 

    public class MainClass implements Runnable, SerialPortEventListener { 
     static CommPortIdentifier portId; 

     static Enumeration portList; 

     InputStream inputStream; 

     SerialPort serialPort; 

     Thread readThread; 

     public static void main(String[] args) { 
     portList = CommPortIdentifier.getPortIdentifiers(); 

     while (portList.hasMoreElements()) { 
      portId = (CommPortIdentifier) portList.nextElement(); 
      if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { 
      // if (portId.getName().equals("COM1")) { 
      if (portId.getName().equals("/dev/term/a")) { 
       MainClass reader = new MainClass(); 
      } 
      } 
     } 
     } 

     public MainClass() { 
     try { 
      serialPort = (SerialPort) portId.open("MainClassApp", 2000); 
     } catch (PortInUseException e) { 
     } 
     try { 
      inputStream = serialPort.getInputStream(); 
     } catch (IOException e) { 
     } 
     try { 
      serialPort.addEventListener(this); 
     } catch (TooManyListenersException e) { 
     } 
     serialPort.notifyOnDataAvailable(true); 
     try { 
      serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, 
       SerialPort.PARITY_NONE); 
     } catch (UnsupportedCommOperationException e) { 
     } 
     readThread = new Thread(this); 
     readThread.start(); 
/*HERE I NEED TO WAIT THE ANSWER*/ 
     } 

     public void run() { 
     try { 
      Thread.sleep(20000); 
     } catch (InterruptedException e) { 
     } 
     } 

     public void serialEvent(SerialPortEvent event) { 
     switch (event.getEventType()) { 
     case SerialPortEvent.BI: 
     case SerialPortEvent.OE: 
     case SerialPortEvent.FE: 
     case SerialPortEvent.PE: 
     case SerialPortEvent.CD: 
     case SerialPortEvent.CTS: 
     case SerialPortEvent.DSR: 
     case SerialPortEvent.RI: 
     case SerialPortEvent.OUTPUT_BUFFER_EMPTY: 
      break; 
     case SerialPortEvent.DATA_AVAILABLE: 
      byte[] readBuffer = new byte[20]; 

      try { 
      while (inputStream.available() > 0) { 
       int numBytes = inputStream.read(readBuffer); 
      } 
      System.out.print(new String(readBuffer)); 
      } catch (IOException e) { 
      } 
      break; 
     } 
     } 
    } 

Mais je dois attendre la réponse avant de quitter la méthode (voir où je mets un espace réservé), je besoin de quelque chose comme une lecture syncronous, comment le faire?

+0

Le code est un peu brouillé. Pas besoin de faire du filetage et des événements. Pourquoi n'écrivez-vous pas simplement dans le flux de sortie du port série et lisez-vous à partir du flux d'entrée? Ce sera synchrone. Si vous avez vraiment besoin d'async, alors vous êtes dans un monde – DomV

+0

Mais je ne sais pas quand l'inputtream recevra des données ... comment arrêter le thread principal jusqu'à ce que l'imprimante réponde? – Tobia

Répondre

0

Pour moi, la solution était: jssc.SerialPort au lieu de rxtx ou java.comm.

Ici, je trouve cette méthode:

public java.lang.String readString(int byteCount, int timeout) 

attendre quelques octets jusqu'à ce qu'un délai d'attente.

Questions connexes