Comunicação serial no ubuntu usando java e API RXTX

Iniciado por rribaldo, 30 de Maio de 2011, 15:19

tópico anterior - próximo tópico

rribaldo

Olá pessoal,

Estou com tentando implementar um teste com a interface serial usando a API RXTX + Java no Ubuntu conforme o código abaixo retirado direto do site da API:

http://rxtx.qbang.org/wiki/index.php/Two_way_communcation_with_the_serial_port



package br.com.home.comunicador;

import static br.com.home.comunicador.util.Kclass.getTokenFinalprojeto;


import gnu.io.CommPort;

import gnu.io.CommPortIdentifier;

import gnu.io.SerialPort;

import gnu.io.SerialPortEvent;

import gnu.io.SerialPortEventListener;



import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.ArrayList;

import java.util.Enumeration;

import java.util.List;



import javax.swing.JOptionPane;



/**

* This version of the TwoWaySerialComm example makes use of the

* SerialPortEventListener to avoid polling.

*

*/

public class TwoWaySerialComm

{



[font=Verdana] public static String mensagemRecebida="";

static byte[] buffer = null;
[/font]


   public TwoWaySerialComm()

   {

       super();

   }

   

   void connect ( String portName ) throws Exception

   {

       CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);

       if ( portIdentifier.isCurrentlyOwned() )

       {

           System.out.println("Error: Port is currently in use");

       }

       else

       {

           CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);

           

           if ( commPort instanceof SerialPort )

           {

               SerialPort serialPort = (SerialPort) commPort;

               serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

               serialPort.setSerialPortParams(1200,SerialPort.DATABITS_8,SerialPort.STOPBITS_2,SerialPort.PARITY_NONE);

               

               InputStream in = serialPort.getInputStream();

               OutputStream out = serialPort.getOutputStream();

                             

               (new Thread(new SerialWriter(out))).start();

               

               serialPort.addEventListener(new SerialReader(in));

               serialPort.notifyOnDataAvailable(true);



           }

           else

           {

               System.out.println("Error: Only serial ports are handled by this example.");

           }

       }    

   }

   

   /**

    * Handles the input coming from the serial port. A new line character

    * is treated as the end of a block in this example.

    */

   public static class SerialReader implements SerialPortEventListener

   {

       private InputStream in;

       

       

       public SerialReader ( InputStream in )

       {

           this.in = in;

       }

       

       public void serialEvent(SerialPortEvent arg0) {

       

        System.out.println("Tipo evento: " + arg0.getEventType());

           int data;

           

           try

           {

  [font=Verdana]         int x = in.available();

            System.out.println("N� de bytes que chegou: " + x);[/font]



           [font=Verdana] buffer = new byte[x];[/font]

               int len = 0;

               while ( ( data = in.read()) > -1 )

               {

                System.out.println(">>> " + data);


                   if ( data == getTokenFinalprojeto() ) {

                    System.out.println(">>> Finalizando com o token getTokenFinalprojeto()");

                       break;

                   }

                   buffer[len++] = (byte) data;

   [font=Verdana]                mensagemRecebida+= new String(buffer);[/font]

                   

               }

               

[font=Verdana]                

               

               System.out.println("1: " + new String(buffer,0,len));

               System.out.println("2: " + new String(buffer));

               System.out.println("3: " + mensagemRecebida);[/font]

               



           }

           catch ( IOException e )

           {

            System.out.println("erro: " + e.getMessage());

               e.printStackTrace();

               System.exit(-1);

           }            

       }



   }



   /** */

   public static class SerialWriter implements Runnable

   {

       OutputStream out;

       

       public SerialWriter ( OutputStream out )

       {

           this.out = out;

       }

       

       public void run ()

       {

           try

           {                

               int c = 0;

               while ( ( c = System.in.read()) > -1 )

               {

                   this.out.write(c);

               }                

           }

           catch ( IOException e )

           {

               e.printStackTrace();

               System.exit(-1);

           }            

       }

   }

   infelizmente funciona perfeitamente no windows, mas no ubuntu, aparentemente ocorrem inúmeras chamadas de tratamento do serialEvent(), no windows apenas uma única e me mostra perfeitamente o resultado ( mensagemRecebida ).

Uso uma biblioteca chamada librxtxSerial.so para linux...

Será que há algo de errado com esse código?

Obrigado!!!



   

   public static void main ( String[] args )

   {

       try

       {

       

       

       

        List<String> portas = new ArrayList<String>() ;

        List<String> listaDePortas =new ArrayList<String>();

       

    String menssagem = "";

   

   

    menssagem +="Entre com uma porta serial!\n Ex.: ";



        Enumeration eportas = CommPortIdentifier.getPortIdentifiers();;





        while (eportas.hasMoreElements()) {

        CommPortIdentifier porta =(CommPortIdentifier)eportas.nextElement();

        if(porta.getPortType()==CommPortIdentifier.PORT_SERIAL){

        listaDePortas.add(porta.getName());    

        }

        }

   

       

 

    portas.clear();

   

    for(String porta : listaDePortas){

    portas.add(porta);

    menssagem+=porta + " ";

    }



   

    int resposta;

    resposta = JOptionPane.showOptionDialog(null,menssagem,"Configurando Porta Serial",0,JOptionPane.QUESTION_MESSAGE,null,portas.toArray(),portas.get(0).toString());        

       

       

           (new TwoWaySerialComm()).connect(portas.get(resposta));

       }

       catch ( Exception e )

       {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

   }





}








Porém, não funciona.

As vezes os caracteres chegam, as vezes chegam trocados e as vezes não chegam.

Já conferi inúmeras vezes as configurações de taxa de transmissão, paridade, controle de fluxo, já troquei a API, enfim, não sei mais o que fazer!!!

Se alguém tiver um código desses que funcione e puder me ajudar?

Obrigado