2013-07-01 4 views
-1

У меня есть этот код для записи и чтения в COM-порт.Java javax.comm syncronous read

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; 
     } 
     } 
    } 

Но мне нужно ждать ответа перед выходом из метода (см где я ставлю заполнитель), мне нужно что-то вроде Синхронный чтения, как это сделать?

+0

Код немного взломан. Не нужно делать потоки и события. Почему бы вам просто не записать в выходной поток последовательного порта и прочитать из входного потока? Это будет синхронно. Если вам действительно нужен async, то вы находитесь в worl – DomV

+0

Но я не знаю, когда входной поток будет получать данные ... как остановить основной поток, пока не ответит на принтер? – Tobia

ответ

0

Для меня решение было: jssc.SerialPort вместо rxtx или java.comm.

Здесь я нашел этот метод:

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

не ждать несколько байт до тайм-аута.