Ir ao conteúdo
  • Cadastre-se
Cristiano Dewes

Problema com comunicação serial em java com Arduino

Recommended Posts

Estou fazendo um programa para, primeiramente, ler uma informação do Arduino Leonardo pela porta serial. Revisei o programa diversas vezes e não encontro erro, porém não estou conseguindo captar as informações do arduino. Utilizando a serial da IDE arduino é possível verificar que o arduino está enviando normalmente as informações. Quando executo o meu programa a conexão é estabelecida porém não retorna nenhum valor enviado. Por favor, preciso de ajuda urgentemente.

OBS.: Há, ainda, uma classe protocolo e outra supervisório. Estas já foram testadas e funcionam normalmente.

package Serial;import gnu.io.CommPortIdentifier;import gnu.io.SerialPort;import gnu.io.SerialPortEvent;import gnu.io.SerialPortEventListener;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.OutputStream;import java.util.Enumeration;/** * * @author dewes_000 */public class SerialRxTx implements SerialPortEventListener {    SerialPort serialPort = null;        private Protocolo protocolo = new Protocolo(); //Objeto de gestão de protocolo    private String appName; //Nome da aplicação        private BufferedReader input; //objeto para leitura na serial    private OutputStream output; //objeto para escrita na serial        private static final int TIME_OUT = 1000; //define o tempo de espera de comunicação    private static int DATA_RATE = 9600; //velocidade da comunicação        private String serialPortName = "COM6";        public boolean iniciaSerial() {        boolean status = false;                try {            //Obtém portas seriais do sistema                        CommPortIdentifier portId = null; //identificador de porta serial            Enumeration portEnum = CommPortIdentifier.getPortIdentifiers(); //recebe em ordem as portas cadastradas no SO                                      while(portId == null && portEnum.hasMoreElements() ) {                CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();                                                if(currPortId.getName().equals(serialPortName) || currPortId.getName().startsWith(serialPortName)) {                    serialPort = (SerialPort) currPortId.open(appName, TIME_OUT);                    portId = currPortId;                                         System.out.println("Conectado em " + currPortId.getName());                    break;                }            }                        if(portId == null || serialPort == null) {                return false;            }                        serialPort.setSerialPortParams( DATA_RATE, //velocidade                    SerialPort.DATABITS_8, //bits de transmição                    SerialPort.STOPBITS_1, //bits de parada                    SerialPort.PARITY_NONE);                        serialPort.addEventListener(this);   //vai escutar eventos da serial            serialPort.notifyOnDataAvailable(true);  //vai ser notificado quando estiver chegando dados                        status = true;                        /*try {                Thread.sleep(1000);                                            } catch (InterruptedException e) {                e.printStackTrace(); //imprime a pilha de excessão                status = false;            }*/                    } catch (Exception e) {            e.printStackTrace();        }                return status;    }        //envia os dados na serial    public void sendData(String data) {        try {            output = serialPort.getOutputStream();            output.write(data.getBytes());//envia os bytes da informação        } catch (Exception e) {            System.err.println(e.toString());            //Podemos exibir uma mensagem;        }    }        //fecha a comunicação serial    public synchronized void close() {        if(serialPort != null) {            serialPort.removeEventListener();            serialPort.close();        }    }            @[member=override]    public synchronized void serialEvent(SerialPortEvent spe) {        //método que lida com a chegada de dados pela serial ao computador                try {            switch(spe.getEventType()) {                case SerialPortEvent.DATA_AVAILABLE:                     if (input == null) {                        input = new BufferedReader( //leitor bufferizado                                new InputStreamReader(                                        serialPort.getInputStream())); //envia o fluxo da porta serial parta o inputStreamReader                                            }                    if(input.ready()) {                        protocolo.setLeituraComando(input.readLine());                        System.out.println("Chegou: " + protocolo.getLeituraComando());                    }                                        break;                                    default:                    break;                            }        } catch (Exception e) {            e.printStackTrace();        }    }    public SerialPort getSerialPort() {        return serialPort;    }    public void setSerialPort(SerialPort serialPort) {        this.serialPort = serialPort;    }    public Protocolo getProtocolo() {        return protocolo;    }    public void setProtocolo(Protocolo protocolo) {        this.protocolo = protocolo;    }    public static int getDATA_RATE() {        return DATA_RATE;    }    public static void setDATA_RATE(int DATA_RATE) {        SerialRxTx.DATA_RATE = DATA_RATE;    }    public String getSerialPortName() {        return serialPortName;    }    public void setSerialPortName(String serialPortName) {        this.serialPortName = serialPortName;    }       }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu estou usando o Windows 8.1. Verifiquei que o programa está enviando normalmente os dados para o arduino, como o esperado. Eu acredito que o problema do meu programa está no serialEvent pois é esta classe que é responsável por captar os dados que são enviados pelo arduino, ou ainda, pode ser a parte do eventListener que não está informando que os dados estão sendo enviados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×