Jogar dados da serial em uma String

12 respostas
Willdoidao

Pessoal, segui este tutorial desse link:

http://www.devmedia.com.br/articles/post-6722-Utilizando-a-API-RXTX-para-manipulacao-da-serial-Parte-I.html

Minha duvida é como faço para pegar o resultado da serial e jogar em uma string?

12 Respostas

matheuslmota

Você pode pegar o InputStream da sua conexão com a porta Serial, a RXTX deve ter algum método para isso, ler um determinado número de bytes e criar uma String a partir desse bytes lidos:

InputStream in = Conexao.getInputStream();//Deve ter algum método assim na RXTX byte[] buffer = new byte[10];// Um buffer para armazenar 10 bytes, mas você pode aumentar o tamanho dele in.read(buffer);//Aqui são lidos 10 bytes e armazenados no buffer anteriormente criado e alocado(observe, no entanto, que talvez não hajam 10 bytes para serem lidos, o método read retorna um int que indica quantos bytes foram lidos, você pode usá-lo para verificações) String str = new String(buffer, "ISO-8859-1");

Observe agora um outro detalhe. Na hora de construir a String, você deve especificar o array de bytes que contém os bytes lidos pela porta Serial e também deve específicar o Encoding da String, eu coloquei “ISO-8859-1”, mas você deve se certificar de usar o Encoding correto para não ter problemas com a criação da String.

Willdoidao

Cara,

Desculpa por minha ignorância mas nw consegui achar o substituto de Conexão neste exemplo que postei.
Poderia me ajudar a achar qual é!?

O main está assim:

public static void main(String[] args) {
     //Iniciando leitura serial
        SerialComLeitura leitura = new SerialComLeitura("COM2", 57600, 0);
        
        
        leitura.HabilitarLeitura();
        leitura.ObterIdDaPorta();
        leitura.AbrirPorta();
        leitura.LerDados();
        
        //Controle de tempo da leitura aberta na serial
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            System.out.println("Erro na Thread: " + ex);
        }
        
           leitura.FecharCom();
    }
}
matheuslmota

Willdoidao:
Cara,

Desculpa por minha ignorância mas nw consegui achar o substituto de Conexão neste exemplo que postei.
Poderia me ajudar a achar qual é!?

Use a classe SerialPort.

Willdoidao

Vixi Matheus,

Agora me perdi mesmo, não estou conseguindo importar de jeito nenhum o SerialPort nem a variável porta que chama essa função.
A classe que tem o SerialPort está assim:

public class SerialComLeitura implements Runnable, SerialPortEventListener {

   /* public class SerialComLeitura implements Runnable, SerialPortEventListener {
    }*/
    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;
    private boolean IDPortaOK;
    private boolean PortaOK;
    private boolean Leitura;
    private boolean Escrita;
    private String Porta;
    protected String peso;

    public void setPeso(String peso) {
        this.peso = peso;
    }

    public String getPeso() {
        return peso;
    }

    public SerialComLeitura(String p, int b, int t) {
        this.Porta = p;
        this.baudrate = b;
        this.timeout = t;
    }

    public void HabilitarEscrita() {
        Escrita = true;
        Leitura = false;
    }

    public void HabilitarLeitura() {
        Escrita = false;
        Leitura = true;
    }

    public void ObterIdDaPorta() {
        try {
            cp = CommPortIdentifier.getPortIdentifier(Porta);
            if (cp == null) {
                System.out.println("Erro na porta");
                IDPortaOK = false;
                System.exit(1);
            }
            IDPortaOK = true;
        } catch (Exception e) {
            System.out.println("Erro obtendo ID da porta: " + e);
            IDPortaOK = false;
            System.exit(1);
        }
    }

    public void AbrirPorta() {
        try {
            porta = (SerialPort) cp.open("SerialComLeitura", timeout);
            PortaOK = true;
            //configurar parâmetros
            porta.setSerialPortParams(baudrate,
                    SerialPort.DATABITS_8,
                    porta.STOPBITS_1,
                    porta.PARITY_NONE);
            porta.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
        } catch (Exception e) {
            PortaOK = false;
            System.out.println("Erro abrindo comunicação: " + e);
            System.exit(1);
        }
    }

    public void LerDados() {
        if (Escrita == false) {
            try {
                entrada = porta.getInputStream();
            } catch (Exception e) {
                System.out.println("Erro de stream: " + e);
                System.exit(1);
            }
            try {
                porta.addEventListener(this);
            } catch (Exception e) {
                System.out.println("Erro de listener: " + e);
                System.exit(1);
            }
            porta.notifyOnDataAvailable(true);
            try {
                threadLeitura = new Thread(this);
                threadLeitura.start();
                run();
            } catch (Exception e) {
                System.out.println("Erro de Thred: " + e);
            }
        }
    }

    public void EnviarUmaString(String msg) {
        if (Escrita == true) {
            try {
                saida = porta.getOutputStream();
                System.out.println("FLUXO OK!");
            } catch (Exception e) {
                System.out.println("Erro.STATUS: " + e);
            }
            try {
                System.out.println("Enviando um byte para " + Porta);
                System.out.println("Enviando : " + msg);
                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);
            }
        } else {
            System.exit(1);
        }
    }

    public void run() {
        try {
            Thread.sleep(5);
        } catch (Exception e) {
            System.out.println("Erro de Thred: " + e);
        }
    }

    public void serialEvent(SerialPortEvent ev) {
        StringBuffer bufferLeitura = new StringBuffer();
        int novoDado = 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:
                //Novo algoritmo de leitura.
                while (novoDado != -1) {
                    try {
                        novoDado = entrada.read();
                        if (novoDado == -1) {
                            break;
                        }
                        if ('\r' == (char) novoDado) {
                            bufferLeitura.append('\n');
                        } else {
                            bufferLeitura.append((char) novoDado);
                        }
                    } catch (IOException ioe) {
                        System.out.println("Erro de leitura serial: " + ioe);
                    }
                }
                setPeso(new String(bufferLeitura));
                System.out.println(getPeso());
                break;
        }
    }

    public void FecharCom() {
        try {
            porta.close();
        } catch (Exception e) {
            System.out.println("Erro fechando porta: " + e);
            System.exit(0);
        }
    }

    public String obterPorta() {
        return Porta;
    }

    public int obterBaudrate() {
        return baudrate;
    }
}
matheuslmota

Importe o pacote gnu.io.SerialPort.

Willdoidao

Matheus cara to dando trabalho eu sei.

Mas mesmo com o import o erro continua. quando coloco o SeriaPort. ele não tem a função getInputStream();

Alguma sugestão do que posso fazer para conseguir essa string?

matheuslmota

Willdoidao:
Matheus cara to dando trabalho eu sei.

Mas mesmo com o import o erro continua. quando coloco o SeriaPort. ele não tem a função getInputStream();

Alguma sugestão do que posso fazer para conseguir essa string?

Você configurou corretamente a RXTX na sua máquina, adicionou o Jar no seu projeto, fez tudo corretamente?
No JavaDoc da classe SerialPort diz possuir esse método, herdado da classe CommPort.
Estranho.

Willdoidao

Fiz sim cara.

Tanto que consigo mostrar a leitura no netbeans.

Postei o código completo para vc dar uma olhada. Pq não sei mais o que mexer nisso!

Willdoidao

Pessoal,

Alguma sugestão? Pq já mexi tanto neste código que não sei mais o que fazer para pegar essa string.

matheuslmota

Willdoidao:
Pessoal,

Alguma sugestão? Pq já mexi tanto neste código que não sei mais o que fazer para pegar essa string.

E por que não fazer o que eu disse? A única forma é cria um array de bytes, ler os bytes da conexão, jogar nesse array e converter o array em uma String, atentando ao fato de usar o encoding correto. Eu olhei seu código, você pode alterar o método ler dados:

public void LerDados() { if (Escrita == false) { try { entrada = porta.getInputStream(); entrada.read(buffer); dados = new String(buffer, "UTF-8"); } catch (Exception e) { System.out.println("Erro de stream: " + e); System.exit(1); } try { porta.addEventListener(this); } catch (Exception e) { System.out.println("Erro de listener: " + e); System.exit(1); } porta.notifyOnDataAvailable(true); try { threadLeitura = new Thread(this); threadLeitura.start(); run(); } catch (Exception e) { System.out.println("Erro de Thred: " + e); } } }

E lá nas declarações das variáveis da classe você coloca:

private String dados; private byte[] buffer = new byte[10];

Você pode coloca um buffer de tamanho maior, coloquei 10, mas podia ser outro valor.

Willdoidao

Cara desculpa a demora em responder. To passando por um problema de saúde serio e to afastado do trabalho. Assim que voltar a ativa vou testar o software e ver se tá funfando!
mas desde já agradeço a ajuda!!!

matheuslmota

Willdoidao:
Cara desculpa a demora em responder. To passando por um problema de saúde serio e to afastado do trabalho. Assim que voltar a ativa vou testar o software e ver se tá funfando!
mas desde já agradeço a ajuda!!!

Que é isso cara, sem problemas. Melhoras!

Criado 10 de agosto de 2011
Ultima resposta 25 de ago. de 2011
Respostas 12
Participantes 2