2009-06-08 5 views
2

Serial Port Wird nicht geschlossen. Ich möchte den COM-Port freizugeben ...Serieller Anschluss Wird nicht geschlossen. Ich möchte den COM-Port freigeben

Unten ist mein Code ....

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

Antwort

2

Wenn Sie eine Version von RXTX-2.1 verwenden, dann durch removeEventListener Aufruf(); Programm sollte hängen. Dies liegt an nativem Code in der Bibliothek. Dies kann durch Ausführen eines solchen Codes vermieden werden, aber für mich persönlich diese Art und Weise nicht wirklich mag:

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

Wenn Sie im Grunde RXTX verwenden, dann Version verwenden 2.2. Sowie Tipps zum Testen der Komponente jSSC - http://code.google.com/p/java-simple-serial-connector/

+0

Ich hatte ein ähnliches Problem mit RXTX-2.1-7 auf Mac OS 10.5.8 PPC. In meinem Fall gab es keinen Absturz, aber keinen Ausgang. Einen Thread zu erzeugen, der geschlossen wird, wenn der Event-Handler die Sperre für den Port aufhebt, liegt auf der Hand - nachdem er gesehen wurde! – Max

+0

@ scream3r, Dies verursacht eine 'EXCEPTION_ACCESS_VIOLATION'. – mre