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