domingo, 19 de maio de 2013

Java Serial Experiments --- Básico

Olá vocês!

Este é um rápido artigo sobre comunicação serial. Isso, portas seriais.

Neste artigo você vai precisar das seguintes ferramentas:

  1. windows 7 (32 ou 64 bits)
  2. jdk 7
  3. eclipse para desenvolvedores java
  4. virtual serial ports emulator
  5. Neuron Robotics Java Serial
Instalação e configuração é mais do mesmo, você já viu isso neste blog várias vezes.

Vamos falar da instalação do virtual serial ports emulator:
O site é esse aí.
E esse é o botão certo de download. Confio em você!


A instalação é um NNF bem simples, você não terá problemas.

Do emulador você só precisa saber o seguinte:
Após deixar rodando, aperte naquele botão com o logo do Red Hot Chilli Peppers e uma porta serial e crie um Connector:
Agora só falta escolher o nome da serial. Deixe COM1 mesmo, ou COM3 se você for conservador.
E pronto, é só isso, emulador em operação.

Vamos ao código. Abra o eclipse que você baixou (Já baixou? Não? baixe. Eu espero.).
Crie um projeto Java:
Vamos chamar o projeto de teste-serial. Aproveite e baixe (se ainda não baixou) o jar do java serial:
Copie o jar e cole-o na pasta do projeto, CTRL+C, CTRL+V.
Se você chegou até aqui, sensacional, parabéns.

Vamos começar, rsrs.

O jar que adicionamos ao projeto, botão direito nele e adicione-o ao build path:
E agora vamos criar nosso pequeno setup de testes:

Faremos algo bem simples, uma classe escreverá na serial, e outra vai ler. Bacana? Vamos chamar uma de Echoer e a outra de Listener:
Vamos implementar:
package sombriks.simpleserial;

import gnu.io.NRSerialPort;

import java.io.DataOutputStream;

public class Echoer {

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception {
  NRSerialPort serial = new NRSerialPort("COM1", 115200);
  serial.connect();
  DataOutputStream outs = new DataOutputStream(serial.getOutputStream());
  while (true) {
   outs.writeChars("FOO");
   Thread.sleep(1000);
  }
//  serial.disconnect();
 }

}



package sombriks.simpleserial;

import gnu.io.NRSerialPort;

import java.io.DataInputStream;

public class Listener {

 public static void main(String[] args) throws Exception {
  NRSerialPort serial = new NRSerialPort("COM1", 115200);
  serial.connect();
  DataInputStream ins = new DataInputStream(serial.getInputStream());
  while (true) {
   System.out.println(ins.read());
   Thread.sleep(1000);
  }
//  serial.disconnect();
 }

}

Bem facinho, ;-)

Vamos comentar um pouco:

Instanciar uma referência para a porta serial é tranquilo, a linha que faz isso é bem evidente. Aquele número depois do nome da porta serial a ser usada é o Baud Rate. O Thread.sleep é para fins didáticos, hehe.

Do lado do Echoer temos uma situação interessante: estamos escrevendo uma String UTF-8. Já do lado do Listener estamos lendo um byte por vez.

Vamos proceder com os testes, e rode primeiro o Listener. A saída do console será algo assim:
Mas espere, o que é este -1? Simples, é o byte lido da serial. Estamos lendo mas ninguém está escrevendo. Faz sentido pra você? Espero que faça.

Observe ainda uma curiosidade: lemos bytes mas o tipo de retorno do método read() é int; isto foi imaginado há muito muito tempo atrás, por gente muito especial, para que quando recebêssemos o -1 (que não é um byte válido) soubéssemos que temos nada pra ler.

Siga para o Echoer agora, dê play nele. Após isso, selecione o console do Listener de volta e veja o que aconteceu:
É isso aí, estamos recebendo dados agora, ;-)

Observação interessante: "0-70-0-79-0-79" são os bytes da string que escrevemos do outro lado. Tem esse zero sempre antes do byte porque as strings do java são em UTF-8, que usa dois bytes por caractere. Não esqueça este tipo de detalhe valioso caso os dados lidos venham de outra fonte!

Por fim, se você matar o Echoer e retornar ao console do Listener, você verá que ele ainda recebe dados... Como e por que isso é possível? simples, O Echoer escreve 6 bytes por iteração do laço. Já o Listener lê um por vez. assim sendo, os dados ficam em buffer esperando que todos sejam lidos.

Como prometido este foi um artigo rápido, espero que tenha sido útil como foi para mim.

Passos futuros podem contemplar criação e/ou análise de algum protocolo, mas deixo isso pra depois.

Sem mais, e até a próxima!



Um comentário :