E ai pessoal beleza. Estou tendo problemas ao ler dados da porta serial através da API java communications (java comm)! Aparentemente estou escrevendo normalmente no barramento, o PIC esta reconhecendo a palavra e retornando pelo barramento uma resposta, mas na hora de fazer a leitura do que veio pelo barramento na porta serial não esta funcionando. Não sei se o método esta incorreto ou se é o modo como estou instanciando que esta errado?! Estarei postando abaixo as chamadas do main() e os métodos referentes. Fiquei sabendo que o método serialEvent é uma função de callback e não precisa ser instanciada, pois ela executa automaticamente se detectado dados no barramento RX da serial? Estou correto? Enfim, Qualquer ajuda será muito bem vinda.
ARQUIVO MAIN
Imports!!
import java.*;
import javax.comm.*; //import javax.comm.CommPortIdentifier;
import javax.comm.NoSuchPortException;
import java.util.*; //import java.util.Enumeration;
import java.io.*;
import javax.swing.*;
import java.lang.Runnable;
Código de verificação de portas disponíveis e chamadas à escrita e leitura
String Porta;
int timeout;
boolean IDPortaOK;
timeout = 1000;
String comando_pic = "teste_escrita_leitura"(char)13;
Enumeration listaDePortas;
CommPortIdentifier cp2;
listaDePortas = CommPortIdentifier.getPortIdentifiers();
while (listaDePortas.hasMoreElements()) {
CommPortIdentifier ips =(CommPortIdentifier)listaDePortas.nextElement();
System.out.println("PORTAS:"+ips.getName());
}
ComunicaçãoSerial CommSerial = new ComunicaçãoSerial();
CommSerial.EnviarUmaString(comando_pic);
CommSerial.LerDados();
FIM DO MAIN
INICIO DOS MÉTODOS DE COMUNICAÇÃO SERIAL
-> MÉTODO PARA ESCRITA NA SERIAL
public void EnviarUmaString(String msg){
int ta;
OutputStream saida = null;
SerialPort porta1 = null;
try {
porta1 = AbrirPorta();
saida = porta1.getOutputStream();
System.out.println("FLUXO OK!");
} catch (Exception e) {
System.out.println("Erro.STATUS: " + e );
}
try {
saida.write(msg.getBytes());
Thread.sleep(100);
saida.flush();
} catch (Exception e) {
System.out.println("Houve um erro durante o envio. ");
System.out.println("STATUS: " + e );
System.exit(1);
}
porta1.close();
}
-> MÉTODO ABRE_PORTA QUE SERÁ REFERENCIADO NA LERDADOS()
public SerialPort AbrirPorta(){
int timeout = 1000;
int braudrate = 9600;
SerialPort porta = null;
CommPortIdentifier cp1 = null;
cp1 = ObterIdPorta();
try {
porta = (SerialPort)cp1.open("SComm",timeout);
System.out.println("Porta aberta com sucesso!");
porta.setSerialPortParams(braudrate,
porta.DATABITS_8,
porta.STOPBITS_2,
porta.PARITY_NONE);
} catch (Exception e) {
System.out.println("Erro ao abrir a porta! STATUS: " + e );
}
return porta;
}
-> MÉTODO 1 PARA LEITURA SERIAL
public void LerDados(){
InputStream entrada=null;
SerialPort porta2 = null;
Thread threadLeitura;
porta2 = AbrirPorta();
try {
entrada = porta2.getInputStream();
System.out.println("FLUXO OK!");
} catch (Exception e) {
System.out.println("Erro.STATUS: " + e );
System.exit(1);
}
try {
porta2.addEventListener(this);
System.out.println("SUCESSO! Porta aguardando...");
} catch (Exception e) {
System.out.println("Erro ao criar listener: ");
System.out.println("STATUS: " + e);
System.exit(1);
}
porta2.notifyOnDataAvailable(true);
try {
threadLeitura = new Thread(this);
threadLeitura.start();
System.out.println("THREAD START\n");
} catch (Exception e) {
System.out.println("Erro ao iniciar leitura: " + e );
}
System.out.println("FECHOU A COMUNICAÇÃO SERIAL\n");
porta2.close();
}
->MÉTODO 2 PARA FINALIZAR A LEITURA (ARMAZENAGEM DOS DADOS)
public void serialEvent(SerialPortEvent ev){
InputStream entrada = null;;
int nodeBytes = 0;
switch (ev.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
byte[] bufferLeitura = new byte[20];
try {
while ( entrada.available() > 0 ) { nodeBytes = entrada.read(bufferLeitura); }
String Dadoslidos = new String(bufferLeitura);
if (bufferLeitura.length == 0) {
System.out.println("Nada lido!");
} else if (bufferLeitura.length == 1 ){
System.out.println("Apenas um byte foi lido!");
} else {
System.out.println("DADOS LIDOS DENTRO DA SERIAL EVENT"+Dadoslidos);
}
} catch (Exception e) {
System.out.println("Erro durante a leitura: " + e );
}
System.out.println("n.o de bytes lidos : " + nodeBytes );
break;
}
}
Obrigado.
[]'s