2009-06-08 15 views
2

シリアルポート閉じられません。あなたは、その後にremoveEventListener()を呼び出すことによって、RXTX-2.1のバージョンを使用している場合、私はシリアルポート閉じられません。 COMポートを解放したい

import java.io.*; 
import java.util.*; 
import gnu.io.*; 

public class ReadCommPort implements SerialPortEventListener { 

    static CommPortIdentifier portId; 
    static Enumeration   portList; 
    InputStream     inputStream; 
    OutputStream    outputStream; 
    public SerialPort   serialPort; 
    List byteList    = new ArrayList(); 
    public static Message message = null; 

    public void readData() { 
     boolean portFound = false; 
     String defaultPort = "COM1"; 
     portList   = CommPortIdentifier.getPortIdentifiers(); 

     while (portList.hasMoreElements()) { 
      portId = (CommPortIdentifier)portList.nextElement(); 
      if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { 
       if (portId.getName().equals(defaultPort)) { 
        System.out.println("Found port: " + defaultPort); 
        portFound = true; 
        buildSerialPort(); 
       } 
      } 
     } 
     if (! portFound) { 
      System.out.println("port " + defaultPort + " not found."); 
     } 
    } 

    public void buildSerialPort() { 
     try { 
      serialPort = (SerialPort) portId.open("ReadCommPort", 1); 
      inputStream = serialPort.getInputStream(); 
      outputStream = serialPort.getOutputStream(); 
      serialPort.addEventListener(this); 
      serialPort.notifyOnDataAvailable(true); 
      serialPort.setSerialPortParams(2400, SerialPort.DATABITS_7, SerialPort.STOPBITS_1, 

        SerialPort.PARITY_NONE); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @SuppressWarnings("unchecked") 
    public void serialEvent(SerialPortEvent event) { 

     switch (event.getEventType()) { 
     case SerialPortEvent.BI: 
      System.out.println("BI"); 
      break; 

     case SerialPortEvent.OE: 
      System.out.println("OE"); 
      break; 

     case SerialPortEvent.FE: 
      System.out.println("FE"); 
      break; 

     case SerialPortEvent.PE: 
      System.out.println("PE"); 
      break; 

     case SerialPortEvent.CD: 
      System.out.println("CD"); 
      break; 

     case SerialPortEvent.CTS: 
      System.out.println("CTS"); 
      break; 

     case SerialPortEvent.DSR: 
      System.out.println("DSR"); 
      break; 

     case SerialPortEvent.RI: 
      System.out.println("RI"); 
      break; 

     case SerialPortEvent.OUTPUT_BUFFER_EMPTY: 
      System.out.println("OUTPUT_BUFFER_EMPTY"); 
      break; 

     case SerialPortEvent.DATA_AVAILABLE : 
      try { 
       int len = inputStream.available(); 
       byte[] readBuffer = new byte[ len ]; 
       // processing data code.. 
       // close the port 
       // release all resources... 
       serialPort.removeEventListener(); 
       try 
       { 
        serialPort.addEventListener(null); 
       } 
       catch (TooManyListenersException e) 
       { 
        e.printStackTrace(); 
       } 
       inputStream.close(); 
       outputStream.close(); 
       serialPort.close(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
      break; 
     } 
    } 

    public static void main(String[] args) { 
     new ReadCommPort().readData(); 
    } 
} 

答えて

2

....以下

は私のコードです... COMポートを解放します。プログラムがハングするはずです。これはライブラリのネイティブコードによるものです。これは、このようなコードを実行することで回避することができますが、私に個人的にこの方法は本当にないように:あなたは基本的にRXTXを使用する場合は、バージョン2.2を使用し

new Thread(){ 
    @Override 
    public void run(){ 
     serialPort.removeEventListener(); 
     serialPort.close(); 
    } 
}.start(); 

。また、コンポーネントを試すためのヒントjSSC - http://code.google.com/p/java-simple-serial-connector/

+0

私はMac OS 10.5.8 PPCでRXTX - 2.1-7と同様の問題を抱えていました。私の場合、クラッシュはありませんでしたが、出口はありませんでした。イベントハンドラがポートのロックを解除したときにスレッドを終了させると、明らかになります。 – Max

+0

@ scream3r、これは 'EXCEPTION_ACCESS_VIOLATION'を引き起こします。 – mre

関連する問題