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