JavaComm

0 respostas
S

Galera estou com uma duvida, no codigo abaixo estou abrindo uma conexão com uma porta serial, enviando um comando, pegando a resposta, e fechando.
Td ocorre bem com exceção do fechamento, ao executar o comando serial.close(); o sistem para ali, não gera nenhum exception mas tb não fecha, ele fica tentando fechar e não consegue.

Alguem sabe me dizer o que fazer quando ao tentar fechar uma porta ela não é fechada?

Obrigado.

package comm;

import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.TooManyListenersException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class serialcomm implements SerialPortEventListener, Runnable {

    String porta;
    final int timeout = 500;
    final int bad = 9600;
    private CommPortIdentifier comPort;
    private SerialPort serial;
    private InputStream in;
    private OutputStream out;
    StringBuffer resposta;

    public void setPorta(String porta) {
        this.porta = porta;
    }

    public void run() {
        try {
            comPort = CommPortIdentifier.getPortIdentifier(porta);
            serial = (SerialPort) comPort.open(porta, timeout);
            serial.setSerialPortParams(bad, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
            serial.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
            in = serial.getInputStream();
            serial.addEventListener(this);
            serial.notifyOnDataAvailable(true);
            out = serial.getOutputStream();
            String comando = "AT+GMM\r";
            out.write(comando.getBytes());
            Thread.sleep(200);
            out.flush();
        } catch (InterruptedException ex) {
            Logger.getLogger(serialcomm.class.getName()).log(Level.SEVERE, null, ex);
        } catch (TooManyListenersException ex) {
            Logger.getLogger(serialcomm.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            System.err.println("Erro de IO");
        } catch (UnsupportedCommOperationException ex) {
            System.err.println("Insuportada Operação!");
        } catch (PortInUseException ex) {
            System.err.println("Porta em uso!");
        } catch (NoSuchPortException ex) {
            System.err.println("Porta não encontrada!");
        }
    }

    public void serialEvent(SerialPortEvent ev) {//evento de quando existir uma resposta da porta
        int novo = 0;
        switch (ev.getEventType()) {
            case SerialPortEvent.DATA_AVAILABLE: {
                try {
                    StringBuffer aux = new StringBuffer();
                    while ((novo = in.read()) > 0) {
                        aux.append((char) novo);
                    }
                    resposta = aux;
                    System.out.println(resposta.toString());
                    fecharComm();
                    break;
                } catch (Exception ex) {
                    ex.printStackTrace();
                } finally {
                    System.exit(0);
                }
            }
            default:
                break;
        }
    }

    private void fecharComm() {
        try {
            serial.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.exit(0);
        }
    }
}

package serialports;

import comm.serialcomm;

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        serialcomm serial=new serialcomm();
        serial.setPorta("COM4");
        new Thread(serial).start();
    }

}
Criado 15 de julho de 2010
Respostas 0
Participantes 1