To ferrado me ajudem - Ler dados da porta serial usando javax.comm

Olá galera to com um mega problema preciso urgente ler dados da porta serial para um trabalho, mais não estou conseguindo se alguem identificar o motivo por favor me ajude, eis o código:

//Programa modificado em 02/09/2007
//Enviar dado para porta serial
// Configuração da porta serial
//Autor: Eng. Eletr. Edson Antonio BAtista
//Versão 10.1


//Importação das classes que serão utilizadas
import java.io.*;
import java.util.*;
import javax.comm.*;
import javax.swing.JOptionPane;



//Definição do nome do programa e implementando as interfaces
//public class serial12 implements Runnable, SerialPortEventListener {
public class serial12 extends Thread implements SerialPortEventListener {

   //Declaração de variaveis global
   static CommPortIdentifier portId; //Classe para identificar a porta
   static Enumeration portList; //Lista de portas
   static OutputStream outputStream; //escreve
   static InputStream inputStream; //lê
   static SerialPort serialPort; 
   Thread readThread;
//necessario 

public static void main(String[] args) throws Exception {

     // serial12 w;
     // w = new serial12();
     // w.gerenciarControle();
  //Inicia a identificação da porta

try {
  portList = CommPortIdentifier.getPortIdentifiers();
    while (portList.hasMoreElements()) {
      portId = (CommPortIdentifier) portList.nextElement();
	if (portId.getName().equals("COM1")) {
	 break;
        }
      }
// Declaração genérica
} catch (Exception ex1) {
System.out.println("Erro de identificação da porta  da porta 1" + ex1);
}
new serial12();

System.out.println("Prepare a COM1 para comunicacao ");
}
   public serial12() {
System.out.println("PAssou aqui");
//Declaração de exceção para os métodos (definidos pelas classes)
        try {
            serialPort = (SerialPort) portId.open("serial12App", 3000);
        } catch (PortInUseException e) {}
        
        try {
            serialPort.setSerialPortParams(9600,
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);
        } catch (UnsupportedCommOperationException e) {}
       
System.out.println("PAssou aqui"); // Mensagem que até aqui não teria erro


       //String opcoes;
 System.out.println("Opcoes \n-----------------------------");
 System.out.println("0 - Finalizar Programa");
 System.out.println("1 - Enviar Comando");
 System.out.println("2 - Receber Dados");

      String opcoes = JOptionPane.showInputDialog("Entre com a opcao desejada");
      int opc = Integer.parseInt(opcoes);


if(opc == 1) {
  

//while(true) { //Gera um loop para ligar/desligar os motores

System.out.println("Opcoes \n-----------------------------");
System.out.println("1 - Liga o Motor");
System.out.println("0 - Desliga o Motor");

String valor = JOptionPane.showInputDialog("Qual a opção desejada?");
  int op = Integer.parseInt(valor);
   int valores = -1;
   int dura = -2;
     try {
  outputStream = serialPort.getOutputStream();
  //while(true) {
        outputStream.write(valores);
 try {
       Thread.sleep(1000);
} catch (Exception tryio) {}
        outputStream.flush();
    System.out.println("byte  " + valores +  "  enviado...");
    System.out.println("Com o tempo de " + " 1" + " ms");
             outputStream.close();
} catch (IOException rsio) {}

if(op == 1) {

System.out.println("O Motor foi ligado com sucesso \n-----------------------------");
}

if(op == 0) {
System.out.println("O Motor foi desligado com sucesso \n-----------------------------");
}

//}
}
//fim do while do loop}

if(opc == 2) {

System.out.println("Opção de leitura \n-----------------------------");
	try {
		inputStream = serialPort.getInputStream();
		System.out.println("FLUXO OK!");
	} catch (Exception e) {
		System.out.println("Erro.STATUS: " + e );
		System.exit(1);
	}

	try {
		serialPort.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);
	}

	serialPort.notifyOnDataAvailable(true);
	
	try {
		//Thread threadLeitura = new Thread(this);
		start();
	} catch (Exception e) {
		System.out.println("Erro ao iniciar leitura: " + e );
	}		
    }
}
    public void run() {

System.out.println("Entrou no Run");

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {}
System.out.print("Final do run \n" );
    }

//}

//gerenciador de eventos de leitura na serial 
   public void serialEvent(SerialPortEvent ev) {
System.out.println("Entrou no serialEvent"); 
switch (ev.getEventType()) { 
//System.out.println("Entrou no serialEvent");
      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 (inputStream.available() > 0) {
            int numBytes = inputStream.read(bufferLeitura);
       }
        System.out.print(new String(bufferLeitura));
        //System.out.print(numBytes);
        } catch (IOException e) {}
            break;
        
                    
//} catch (Exception e) { 
            //System.out.println("Erro durante a leitura: "  + e ); 
        } 
      } 
     
}

Peguei o exemplo de leitura de um artigo, mais não entendi como ele vai chamar o metodo serialEvent, sendo que não tem nada chamando ele, e todos exemplos que vi de leitura nenhum chama esse metodo, como é possivel??

Abraços

Qual é o erro que esta dando? eu estou usando numa comunicação com CLP e ta tudo tranquilo.

Ai que ta, não esta dando erro, ele apenas não recebe…

Ai que ta, não esta dando erro, ele apenas não recebe…

Ja tentou debugar na rotina que esta recebendo?
ve se ele esta enviando dados!!!
pode ser erro na rotina de receber dados

Da uma olhada nesta dica vc se te ajuda…

Abraços

  1. Baixar a API:
    Você encontra a API disponível no site:
    http://java.sun.com/products/javacomm/index.jsp
    Basta baixar a API e realizar os procedimentos de instalação. Após baixar a API, descompactá-la,
    você
    terá:
    o Copiar o arquivo win32com.dll para o diretório C:\JavaSDK\BIN (isto é, o diretório onde o
    J2SDK foi instalado no seu PC).
    o Copiar o arquivo comm.jar para o diretório C:\JavaSDK\BIN\LIB.
    o Copiar o arquivo javax.comm.properties para o diretório C:\JavaSDK\BIN\LIB.
    o Em seguida configure o CLASSPATH para que ele reconheça o arquivo comm.jar.

RECONHECENDO AS PORTAS
//…
Enumeration listaDePortas;
listaDePortas = CommPortIdentifier.getPortIdentifiers();
//…
//…
int i = 0; portas = new String[10];
while (listaDePortas.hasMoreElements()) {
CommPortIdentifier ips = (CommPortIdentifier)listaDePortas.nextElement(); portas[i] =
ips.getName();
i++;
}
//…

ABRINDO AS PORTAS
O método getPortIdentifier(String porta) da classe CommPortIdentifier retorna um identificador da
porta escolhida. Precisamos instanciar um objeto para receber esse identificador:
CommIdentifier cp = CommPortIdentifier.getPortIdentifier(minhaPortaEscolhida);
Em seguida criamos uma instância da classe SerialPort utilizando o identificador. Note que uma
conversão deverá ser feita. A porta só pode ser instanciada através desse ?casting? e ao mesmo
tempo abrimos a porta para comunicação:
SerialPort porta = (SerialPort)cp.open(“SComm”,timeout);
O método open() tem como parâmetros o nome da classe principal (faça isso para não gerar
conflitos) e o valor desejado para timeout. Em seguida, precisamos atribuir fluxos de entrada e saída.
Basta utilizar as classes Abstratas OutputStream e InputStream, já que a classe SerialPort
implementa os métodos de entrada e saída dessas classes para comunicação serial. Para ler dados na
porta serial:
InputStream entrada = porta.getInputStream();
E para escrever dados na porta serial:
OutputStream saida = porta.getOutputStream();
Em seguida precisamos configurar os parâmetros de comunicação serial, para isso utilizamos o
método setSerialPortParams:
porta.setSerialPortParams(baudrate, porta.DATABITS_8, porta.STOPBITS_2,
porta.PARITY_NONE);

ENVIANDO DADOS
Depois de configurar a porta para comunicar e definido o fluxo de saída, podemos comunicar os
dados. Isso é bem simples:
String msg = ?Olá Mundo!?;
saida.write(msg.getBytes());
Thread.sleep(100);
saida.flush();

RECEBENDO DADOS
porta.addEventListener(this);
porta.notifyOnDataAvailable(true);
public void serialEvent(SerialPortEvent ev){
switch (ev.getEventType()) {
//?
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(Dadoslidos);
}
} catch (Exception e) {
System.out.println("Erro durante a leitura: " + e );
}
System.out.println("n.o de bytes lidos : " + nodeBytes ); break; }
}

Muito bom esse mini-tutorial do Fabio_De_Carli.

Mas Fábio, não podemos simplesmente descartar esse evento serialEvent e deixar um while(true) num thread separado verificando o tempo inteiro se temos data esperando pra ser inputada??

Por favor gostaria de entender qual a vantagem de utilizar um listener para tal fim!

(Estou perguntando isso pq em um projeto pessoal meu também estou mexendo com envio e recebimento de informações [no caso, via bluetooth]. Estou pronto para atualizar minha aplicação caso eu encontre outras maneiras mais corretas de solucionar o meu problema).

Atenciosamente, Rafael.