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

6 respostas
A

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

6 Respostas

N

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

A

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

A

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

N

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

F

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

}
R

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.

Criado 21 de setembro de 2007
Ultima resposta 22 de set. de 2007
Respostas 6
Participantes 4