Dados inconsistentes no buffer ao utilizar método serialEvent()

Estamos desenvolvendo uma aplicação de automação utilizando o pic16F628 e interfaceando em Java com a API javacomm. Nos deparamos com o seguinte problema:

  • Ao ler os dados que estão vindo da porta serial, eles são armazenados em um vetor do tipo byte:
 byte[] bufferLeitura = new byte[20]; 

Este vetor esta captando dados inconsistentes como, por exemplo: [B@29d65b.
Onde no PIC é enviado o número inteiro 15 e acreditamos que o Java recebe da porta serial em hexadecimal, devendo aparecer no buffer ?F?. O ?[B@? aparece em todas as leituras.

Após recebermos estes dados no vetor de armazenamento do buffer. Instanciamos a classe String passando como parâmetro o buffer lido.

 String Dadoslidos = new String(bufferLeitura); 

Quando realizamos esta implementação, o que é gerado e armazenado na variável Dadoslidos é o seguinte: 
20 quadrados que acreditamos ser o tamanho do buffer e que o mesmo esta vazio.

E logo após nos informa um erro:

Erro durante a leitura: java.lang.NullPointerException 

Entrando no try da serialEvent e também no catch.

Segue em anexo os 2 arquivos .java de nossa aplicação. Testamos os dados em programas de rastreamento de porta serial e os dados que estão vindo do PIC estão ok.

Gostaríamos que alguns de vocês pudessem nos ajudar a resgatar do buffer o valor real enviado pelo PIC que no caso é 15 ou F em Hexa. Desde já agradecemos por lerem o post.

Ps: Desculpas pelos erros gramaticais… rss

Códigos:

main.java

/*
 * Main.java
 *
 * Created on 10 de Outubro de 2007, 22:48
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package serialcomm;

import java.*;
import java.text.StringCharacterIterator;
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;


/**
 *
 * @author Administrador
 */
public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
         //VARIAVEIS UTILIZADAS
        
        String Porta;
        int timeout; 
        boolean IDPortaOK;
        timeout = 1000;
        
        String VarTeste = "teste"+(char)13;
        //String fim = "/0";
        
        Enumeration listaDePortas;
        CommPortIdentifier cp2;
                    
        listaDePortas = CommPortIdentifier.getPortIdentifiers();
        
        while (listaDePortas.hasMoreElements()) {
         CommPortIdentifier ips =(CommPortIdentifier)listaDePortas.nextElement();
         System.out.println("PORTAS:"+ips.getName());
         
        }
        
        //INICIO PROGRAMA TESTE 
         ComunicaçãoSerial CommSerial = new ComunicaçãoSerial();          
         CommSerial.EnviarUmaString(VarTeste);
         //CommSerial.EnviarUmaString(fim);
         CommSerial.LerDados();
         
                               
    }
    
}

ComunicaçãoSerial.java

/*
 * ComunicaçãoSerial.java
 *
 * Created on 11 de Outubro de 2007, 15:11
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */  

package serialcomm;

import java.*;
import javax.comm.*;   
import javax.comm.NoSuchPortException;
import java.util.*;  
import java.io.*;
import javax.swing.*; 
import java.lang.*;

import javax.swing.JOptionPane;
import javax.comm.CommPortIdentifier;   
import javax.comm.SerialPort;   
import javax.comm.SerialPortEvent;   
import javax.comm.SerialPortEventListener; 

/**
 *
 * @author eurico
 */
public class ComunicaçãoSerial implements Runnable, SerialPortEventListener {
    private InputStream entrada;
    public int nodeBytes;
    SerialPort porta_fechar = null;
    
   /*METODO PARA OBTER O ID DA PORTA*/
    
    public CommPortIdentifier ObterIdPorta(){
        String Porta;
        Porta = "COM1";
        //boolean IDPortaOK;
        CommPortIdentifier cp = null;

        try {
        cp = CommPortIdentifier.getPortIdentifier(Porta);
        System.out.println("CommPortIdentifier ="+cp);
        System.out.println("DENTRO DA FUNÇÃO OBTER_ID_PORTA\n" );
        if ( cp == null ) {
        System.out.println("A " + Porta + " nao existe!" );
        System.out.println("ERRO!Abortando..." );
        return cp;
        }
        } catch (Exception e) {
        System.out.println("Erro durante o procedimento. STATUS" + e );
        }
        return cp;
    }
    
    /*METADO PARA ABRIR A PORTA*/
    
    public SerialPort AbrirPorta(){
         int timeout = 1000;
         int braudrate = 19200;
         SerialPort porta = null;
         CommPortIdentifier cp1 = null;
         cp1 = ObterIdPorta();
        try {
                porta = (SerialPort)cp1.open("SComm",timeout);
                System.out.println("Porta aberta com sucesso!");
                //configurar parâmetros
                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;
        }
    
    /*METODO PARA ENVIAR UM STRING PARA A PORTA 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());
                   //saida.write(13);
                                   
                    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();
        }
    
    /*METODO DE LEITURA DE DADOS DA  PORTA SERIAL*/
    public void FecharCom(SerialPort porta){
        try {
              porta.close();
              System.out.println("CONEXAO FECHADA>>FIM..");
             } catch (Exception e) {
                System.out.println("ERRO AO FECHAR. STATUS: " + e );
                System.exit(0);
            }
}
    
    /*METODO DE LEITURA DE DADOS DA  PORTA SERIAL*/
              
    public void LerDados(){
        
            InputStream entrada=null;
            SerialPort porta2 = null;
            Thread threadLeitura;
            
            porta2 = AbrirPorta();
            
                try {
                      entrada = porta2.getInputStream();
                     // entrada = porta2.setInputBuffer(20);
                      System.out.println("FLUXO OK1111!");
                    } 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);
                        System.out.println("THREAD START\n");
                        threadLeitura.start();
                        } catch (Exception e) {
                            System.out.println("Erro ao iniciar leitura: " + e );
                        }
          System.out.println("FECHA A COMUNICAÇÃO SERIAL\n");

         //porta2.close();
    } 
    
    //método RUN da thread de leitura
     public void run(){
     System.out.println("Entrou na RUN \n");
         try {
            Thread.sleep(500);
         } catch (Exception e) {
            System.out.println("Erro. Status = " + e );
        }
     }
  /*GERENCIADOR DE EVENTOS DE LEITURA NA PORTA SERIAL*/
  public void serialEvent(SerialPortEvent ev){

      System.out.println("DENTRO DO METADO SERIALEVENT\n ");
     
      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:
              
               
               System.out.println("DATA_AVAILABLE - Existem dados sendo recolhidos do barramento\n");
               
                                                                  
                 byte[] bufferLeitura = new byte[20];
                 String Dadoslidos = new String(bufferLeitura);
                 System.out.println("buffer>>"+bufferLeitura);
                 System.out.println("Dados lidos>>"+Dadoslidos);
                 try {
                     System.out.println("entrou no TRY_1\n");
                      while ( entrada.available() > 0 ) {
                         System.out.println("entrou no WHILE\n");
                         nodeBytes = entrada.read(bufferLeitura);
                      }
                        System.out.println("entrou no TRY_2\n");
                        //String Dadoslidos = new String(bufferLeitura);
                        System.out.println("entrou no TRY_3\n");
                        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>>"+Dadoslidos);
                                    }
                     } catch (Exception e) {
                       System.out.println("Erro durante a leitura: " + e );
                       }
                System.out.println("n.o de bytes lidos : " + nodeBytes );
                break;
                 
        }

    }

}    

Olá pessoal,
descobrimos que nosso problema esta no método serialEvent na linha 211 no trecho.

nodeBytes = entrada.read(bufferLeitura);

quando esta linha não esta comentada, ele simplesmente executa esta linha ou não executa e pula para o fim no último else como se tivesse dados, mas o buffer esta vázio. O que pode ser?!

Você não pode usar “toString” com arrays de bytes. Você deve converter o array de bytes para uma string e depois imprimir. Exemplo:

byte[] bytes = new byte[] { 48,49,50,51,52 };
System.out.println (bytes); // imprime algo como "@[BCAFE0123" que é: um "@", mais o tipo ("[B" quer dizer "byte[]"), e o hashcode desse objeto (por exemplo, CAFE0123).
String s = new String (bytes, "Windows-1252"); 
System.out.println (s); // deve imprimir "01234"