Escrita e leitura da porta serial

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

Tive o mesmo problema no meu trabalho… mas o interessante era que o problema não estava no codigo JAVA e sim comunicação Serial, o aparelho simplesmente não escrevi nada na porta serial…
O que me ajudou foi pegar um Programa chamado “HHD Free Serial Port Monitor” para saber realmente se o aparelho estava escrevendo ou não na porta serial…

Então verifique se realmente se esta ocorrendo a comunicação :thumbup:

E ai Raphael blz,
poizé cara coisa loca. Estou baixando aqui o “HHD Free Serial Port Monitor” e vou testar para ver se realmente esta escrevendo e sendo pego pelo PIC. A gente testou com um monitor do site do Rogercom em C e funfou beleza, mas quando passamos pro java a coisa zico. Aparentemente os métodos estão corretos não estão?! Obrigado.

Pessoal Help :frowning: hehehe