views:

685

answers:

1

Serial Port Not getting closed. I want to release the COM port ...

Below is my 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();
    }
}
A: 

If you are using a version of RXTX-2.1, then by calling removeEventListener (); program should hang. This is due to native code in the library. This can be avoided by running such a code, but to me personally this way do not really like:

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

If you basically use RXTX, then use version 2.2. As well as tips to try component jSSC - http://code.google.com/p/java-simple-serial-connector/

scream3r