Java javax.comm同步读取

时间:2013-07-01 20:43:05

标签: java com javax.comm

我有这段代码可以写入和读取COM端口。

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

但是我需要在退出方法之前等待答案(看看我放置占位符的位置),我需要类似同步读取的东西,怎么做?

1 个答案:

答案 0 :(得分:0)

对我而言,解决方案是:jssc.SerialPort 而不是rxtx或java.comm。

我在这里找到了这个方法:

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

等待一些字节,直到超时。