Obrigado por visitar a devmedia.com.br!

Precisamos de você para divulgar nossos vídeos e cursos gratuitos para a comunidade.

Se você gosta da devmedia.com.br por favor dê-nos o seu clique para o Google+ e ajude outros desenvolvedores ao redor do mundo.



Obrigado por seu apoio!
Equipe DevMedia

sair sem compartilhar (x)
DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:

Como configurar e abrir uma Porta Serial – Parte II

Dando prosseguimento à primeira parte deste artigo, onde apresentei uma visão geral de como devemos proceder para uma comunicação via porta serial, irei nesta segunda parte solucionar alguns questionamentos.



Dando prosseguimento à primeira parte deste artigo, onde apresentei uma visão geral de como devemos proceder para uma comunicação via porta serial, irei nesta segunda parte solucionar alguns questionamentos.

O primeiro dos questionamentos seria; Como devemos configurar e abrir uma porta tanto para escuta como para escrita de algum tipo de informação?

Para isso a API disponibiliza a seguinte solução:
CommPortIdentifier.Open(); //Este método retorna um objeto do tipo SerialPort.

Ates da chamada para este método é preciso ter em mente que devemos nos preocupar como a porta irá se comportar com o mundo exterior, ou seja, qual será a sua taxa de transferência?; Existe paridade?; Qual será o “Stop Bit” (Bit de parada do pacote)? Fornecer essas informações talvez seria um tanto quanto desconfortáveis caso escrevamos um código sem a utilização da API.

Felizmente, a API da SUN disponibiliza uma interface portável para todos estes parâmetros. Há quatro passos a serem seguidos até ter uma porta pronta para enviar quanto para receber algum dado, são eles:

1 – Escolher a porta.
2 – Chamar o método CommPortIdentifier.Open(), tendo a preocupação de realizar um cast para a porta desejada, neste caso SerialPort.
3 – Configurar os parâmetros de comunicação serial, tais como baud rate (taxa de transferência), parity (paridade), stop bits (bit de parada), entre outros, procedendo a configuração em um único momento ou individualmente, sendo que para qualquer dos procedimentos preferidos, deve-se utilizar o método, setSerialPortParan();
4 – Chamar os métodos getInputStream e getOutputStream do objeto SerialPort, além de prover um Stream e umWriter (Classes do java.io.*, que abrem fluxos de dados entre o programa e qualquer tipo de dados, seja ele um arquivo, teclado, porta de comunicação serial, entre outros.)

Fazendo isso você estará pronto para ler e escrever em uma porta serial. Segue abaixo um trecho de código:


// Abre a porta para comunicação

public void abrePortaCom() {
/*
* Para a porta ser aberta precisa ter um identificador do tipo da porta, para isso usa-se o método getPortIdentifier("Qual é a porta? COM1, LPT1 ...") da classe CommPortIdentifier.
*
* Tendo feito isso há a necessidade, agora, de instanciar o tipo da porta que foi escolhida, nesse caso a porta serial a qual recebe o identificador juntamente com o método open() que recebe como parâmetro um nome identificador (um título) e o tempo de espera de alguma resposta (timeout).
*
* Estando a porta aberta, configura-se os parâmetros de comunicação serial.
*/

try{
  
idPorta = CommPortIdentifier.getPortIdentifier(tipoPorta);
  
portaSerial =(SerialPort)idPorta.open("PlacaSensoriamento",timeout);
   JOptionPane.showMessageDialog(
null, "Configurando Porta Serial");
  
portaSerial.setSerialPortParams(baudrate, portaSerial.DATABITS_8, portaSerial.STOPBITS_1, portaSerial.PARITY_NONE);
}

catch (NoSuchPortException nspe){
   System.
err.println("Posta não existe! : " + tipoPorta);
}

catch (PortInUseException piu){
   System.
err.println("Porta ja esta aberta!");
}

catch (UnsupportedCommOperationException uscoe){
   System.
err.println("Configuração dos parametros da porta não suportada!");
}
}

Suponhamos que você queira enviar um comando para um dispositivo externo e receber uma resposta do mesmo. Segue abaixo o código para realizar a leitura e o envio de uma String que segue alguns passos que o próprio código relada em forma de comentários.

/*
* Ler dados é um pouco mais complicado! passos a serem seguidos
*
* - Criar um fluxo de entrada.
* - Adicionar um gerenciador de eventos para dados na porta serial.
* - Instanciar uma Thread para aguardar os eventos.
* - Tratar os eventos e receber os dados.
*/

public void iniciaLeitura(){
  
try{
     
portaEntrada = portaSerial.getInputStream();
     
portaSerial.addEventListener(this);
     
// Agora tem-se uma notificação de dados disponível

      portaSerial.notifyOnDataAvailable(true);
     
// Threads responsíveis por aguardar os eventos

      thread = new Thread(this);
     
thread.start();
   }

    catch (IOException ioe){
       System.
err.println("Erro de comunicação com a porta!");
    }

    catch (TooManyListenersException tmle){
       System.
err.println("Erro. Muitos métodos ouvintes na porta!");
    }

    catch (Exception e){
        System.
out.println("Erro ao iniciar leitura com a thread!");
    }

}

// Método que envia um bit para a porta serial
public void EnviarUmaString(int comando){

   this.comando = comando;
  
try {
     
saida = portaSerial.getOutputStream();
     
saida.write(comando);
      Thread.sleep(100);
     
saida.flush();
   }
catch (IOException ioe){
      System.
out.println("Não foi possivel abrir/enviar_comando na porta serial");
    
System.out.println("Erro! STATUS: " + ioe );
   }
catch (InterruptedException ie){
      System.
out.println("Problema com as Threads");
      System.
out.println("Erro: Status: " + ie);
   }
}

Segue abaixo mais um trecho de código definindo o tratador de eventos de chegada de dados para a leitura.

// Gerenciador de eventos na porta serial

public void serialEvent(SerialPortEvent spe){
  
switch( spe.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:

   try{
     
while ( portaEntrada.available() > 0 ) {
         tmp = Integer.toHexString(
portaEntrada.read());
         st = st + tmp;
      }
      System.
out.println(" > " + st);
   }

   catch(Exception ioe){
      System.
err.println("Erro de Leitura!");
      ioe.printStackTrace();
   }

Espero que todos tenham tirado proveito desse primeiro artigo que posto para o portal. Muito em breve estarei enviando outro, e neste momento deixo todos à vontade para tecer suas críticas.





    1 COMENTÁRIO

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Wellington De Oliveira

Tenho um problema com um equipamento que utiliza a porta serial (com3 criada pelo model USB externo WTS 32 da Dataregis) as vezes ele da a mesangem de SIOWINERROR, dizendo que a porta ja esta sendo utilizada por outro aplicativo. Obs. A função do nosso sistema de transferencia de dados é, verificar o sinal do modem e ai mandar os dados e fechar, não entendo porque ele funciona as vezes o dia inteiro e de uma hora para outra para. Desde ja agradeço. Obrigado



em 1/10/2008 11:26 - Responder

 



[Este post ainda não foi associado a uma sequência]
Autor
Marcio Santos De Carvalho

Marcio Santos de Carvalho (marciosdc@gmail.com), Bacharel em Sistemas de Informação pela Faculdade de Tecnologia e Ciências em Feira de Santana, Bahia. Trabalha com o desenvolvimento de sistemas para o agronegócio que envolvam sensoriamento de ambientes hidrobiológicos desde 2003. Atuante como Diret...


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
7   1
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]
Este post está disponível para assinantes da Java Magazine ou para quem possui Créditos DevMedia.

  Conheça os planos de créditos DevMedia e visualize esse post agora mesmo!

Plano conveniência – Neste plano este post custa R$ 0,00 (Compre agora)
Esse plano permite que você compre somente um post, pagando por ele seu preço sem desconto.

Plano ocasional: Aqui este post custa: R$ -1,00 (assinante) ou R$ -1,00 (não-assinante)
Este plano é ideal para quem tem interesse em mais de um post. Você compra um mínimo de R$ 50,00 em créditos e ganha, em média, 50% de desconto no preço do post. Compre Créditos agora!

Assinatura de Créditos (Plano econômico) – Aqui este post custa R$ -1,00
Este plano é ideal para quem tem interesse em muitos posts. Com esse plano você compra R$ 180,00 em créditos e ganha, em média, 80% de desconto no preço do post. Assine este plano agora!

> Saiba mais sobre o Sistema de Créditos DevMedia
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03