2

串行端口未关闭。我想释放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();
    }
}
4

1 回答 1

2

如果你使用的是RXTX-2.1版本,那么通过调用removeEventListener();程序应该挂起。这是由于库中的本机代码。这可以通过运行这样的代码来避免,但对我个人来说,这种方式并不喜欢:

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

如果您基本上使用 RXTX,则使用 2.2 版本。以及尝试组件 jSSC 的提示 - http://code.google.com/p/java-simple-serial-connector/

于 2010-10-13T16:51:19.890 回答