Comunicação Porta Serial JAVACOMM

6 respostas
GraGarcia

Boa tarde a todos!

Faz um tempo que eu não utilizo a linguagem JAVA para criar aplicativos, mas me deparei com um projeto em que meus superiores exigiram a utilização da mesma.

Busquei aqui no forum e encontrei um tutorial muito didático e de fácil compreensão, realizei algumas alterações e estou utilizando ele por enquanto até entender o funcionamento da API. Estou comunicando com a porta serial COM1 utilizando a API JAVACOMM, o processo de comunicação está correto, minha dificuldade é entender os caracteres vindos do equipamento ligado na porta serial. Segue abaixo o formato que está sendo retornado junto os formatos correspondentes:

.:: Iniciando leitura ::.
O QUE FOI REALMENTE LIDO UTF8: ???x?xfxfx ???
O QUE FOI REALMENTE LIDO ISO-8859-1: ???x?xfxfx þ???
O QUE FOI REALMENTE LIDO ascii: ???x?xfxfx ???
O QUE FOI REALMENTE LIDO ASCII: ???x?xfxfx ???

Segue código:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Graziani Garcia
 */

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.awt.Font;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.comm.*;
import java.io.*;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class SrCom implements Runnable, SerialPortEventListener {
    //propriedades
    private String Porta;
    public String Dadoslidos;
    public int nodeBytes;
    private int baudrate;
    private int timeout;
    private CommPortIdentifier cp;
    private SerialPort porta;
    private OutputStream saida;
    private InputStream entrada;
    private Thread threadLeitura;
    //indicadores
    private boolean IDPortaOK; //true porta EXISTE
    private boolean PortaOK;// true porta aberta
    private boolean Leitura;
    private boolean Escrita;
    //construtor default paridade : par
    //baudrate: 9600 bps stopbits: 2 COM 1
    
    private String linArq;
    private String linArq2;
    private String linArq3;
    private String linArq4;
    private String fechaArq;
    TelaPrincipal telaPrincipal = new TelaPrincipal();
    private JLabel jLabel1 = new JLabel();
    
    public SrCom() {
       Porta = "COM1";
       baudrate = 9600;
       timeout = 1000;
    };
    //um Objeto ComObj é passado ao construtor
    //com detalhes de qual porta abrir
    //e informações sobre configurações
    public SrCom( String p , int b , int t ){
        this.Porta = p;
        this.baudrate = b;
        this.timeout = t;
    }; 
    //habilita escrita de dados
    public void HabilitarEscrita(){
        Escrita = true;
        Leitura = false;
    }
    //habilita leitura de dados
    public void HabilitarLeitura(){
        Escrita = false;
        Leitura = true;
    }
    //Obtém o ID da PORTA
    public void ObterIdDaPorta(){
    try {
        cp = CommPortIdentifier.getPortIdentifier(Porta);
        if ( cp == null ) {
            JOptionPane.showMessageDialog(null, "A " + Porta + " nâo existe! ERRO! Abortando...");
            IDPortaOK = false;
            System.exit(1);
        }
        IDPortaOK = true;
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null,"Erro durante o procedimento. STATUS " + e );
        IDPortaOK = false;
        System.exit(1);
    }
}
    //Abre a comunicação da porta
    public void AbrirPorta(){
    try {
        porta = (SerialPort)cp.open("SCom",timeout);
        PortaOK = true;
//        System.out.println("Porta aberta com sucesso!");
//        telaPrincipal.jLabel1.setText("Porta aberta com sucesso!");
        //configurar parâmetros
        porta.setSerialPortParams(baudrate,
        porta.DATABITS_8,
        porta.STOPBITS_2,
        porta.PARITY_NONE);
    } catch (Exception e) {
        PortaOK = false;
        JOptionPane.showMessageDialog(null,"Erro ao abrir a porta! STATUS: " + e );
        System.exit(1);
      }
    }
    //leitura de dados na serial
    public void LerDados(){
        if (Leitura == true){
            try {
                entrada = porta.getInputStream();
                JOptionPane.showMessageDialog(null,"FLUXO OK!");
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null,"Erro.STATUS: " + e);
                System.exit(1);
              }
            try {
                porta.addEventListener(this);
                JOptionPane.showMessageDialog(null,"SUCESSO. Porta aguardando...");
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null,"Erro ao criar listener. STATUS: " + e);
                System.exit(1);
              }
            porta.notifyOnDataAvailable(true);
            try {
                threadLeitura = new Thread(this);
                threadLeitura.start();
                run();
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null,"Erro ao iniciar leitura: " + e);
              }
        }
    }
    //método RUN da thread de leitura
    public void run(){
        try {
            Thread.sleep(5000);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Erro. Status = " + e);
          }
    }
    //gerenciador de eventos de leitura na serial
    public void serialEvent(SerialPortEvent ev){
        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, "UTF8");
                String Dadoslidos2 = new String(bufferLeitura, "ISO-8859-1");
                String Dadoslidos3 = new String(bufferLeitura, "ascii");
                String Dadoslidos4 = new String(bufferLeitura, "ASCII");
                linArq = ".:: Iniciando leitura ::.";
                GerarArquivo(linArq);
                if (bufferLeitura.length == 0) {
                    linArq = "Nada foi lido!";
                    GerarArquivo(linArq);
                } else if (bufferLeitura.length == 1 ){
                    linArq = "Apenas um byte foi lido!";
                    GerarArquivo(linArq);
                } else {
                    linArq = " O QUE FOI REALMENTE LIDO UTF8: " + Dadoslidos;
                    linArq2 = " O QUE FOI REALMENTE LIDO ISO-8859-1: " + Dadoslidos2;
                    linArq3 = " O QUE FOI REALMENTE LIDO ascii: " + Dadoslidos3;
                    linArq4 = " O QUE FOI REALMENTE LIDO ASCII: " + Dadoslidos4;
                    GerarArquivo(linArq);
                    GerarArquivo(linArq2);
                    GerarArquivo(linArq3);
                    GerarArquivo(linArq4);
                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null,"Erro durante a leitura: " + e);
              }
            linArq = "n.o de bytes lidos : " + nodeBytes;
            GerarArquivo(linArq);
            break;
        }
    }
        
    public void GerarArquivo(String linha){
        File file = new File("C:\\");
        if(file.exists() == false){
            JOptionPane.showMessageDialog(null,"Diretório " + file + " não existe!!");
        }
        try {
            FileWriter writer = new FileWriter(new File("C:\\LogMedidor.txt"),true);
            PrintWriter saida = new PrintWriter(writer); 
            saida.println(linha);
            saida.close();
            writer.close();
        } catch (IOException ex) {
            Logger.getLogger(SrCom.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    //função que fecha a conexão
    public void FecharCom(){
        try {
            porta.close();
            JOptionPane.showMessageDialog(null,"CONEXAO FECHADA>>FIM..");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"ERRO AO FECHAR. STATUS: " + e);
            System.exit(0);
          }
    }
    //Acessores
    public String obterPorta(){
        return Porta;
    }
    public int obterBaudrate(){
        return baudrate;
    }
}

Desculpe caso não esteja respeitando muito os padrões de projeto, está é apenas um protótipo para testar a comunicação.

Aguardo retorno ciente de que serei muito bem instruído.

Att,
Graziani Garcia

6 Respostas

josue_carrecon

Sua dificuldade eh em entender ou tratar os dados vindos?

GraGarcia

josue carrecon, bom dia!

Acredito que as duas situações, pois, quando conseguir tratar os dados corretamente, estarei compreendendo-os.

Resumindo minha dificuldade, quero entender (conseguir ler) o que está vindo da máquina ligada a porta serial.

Grato pelo retorno,

Att,
Graziani Garcia

Luizao

Porquê vc está convertendo os bytes para string??

GraGarcia

Bom dia Luizao,

Estou utilizando um exemplo que encontrei aqui no GUJ e fiz algumas alterações, o mesmo  estava convertendo, o que eu preciso fazer é conseguir ler o que está vindo através da porta serial. Faz tempo que não trabalho com java e muito menos comunicação via serial.

Você sabe me dizer como posso fazer pra conseguir ler o que está sendo trafegado?

Grato pela atenção!

Att,
Graziani Garcia

Luizao

Seu código aparentemente está ok. Se não está lendo, verifique os parâmetros da porta serial (baud rate, stopbits, etc).

Que tipo de dispositivo está ligado na serial? Vc está usando algum adaptador ou a porta serial do computador mesmo?

GraGarcia

Luizao, bom dia!

Lendo ele está, só não consigo entender a informação obtida. Entrei em contato com o fabricante do medidor de vazão e ele me passou o parâmetros de Baud rate, data bits, stopbits. O dispositivo esta ligado diretamente a porta serial COM1.

Att,
Graziani Garcia

Criado 19 de setembro de 2012
Ultima resposta 25 de set. de 2012
Respostas 6
Participantes 3