Autor Tópico: Comunicação serial no ubuntu usando java e API RXTX  (Lida 3024 vezes)

Offline rribaldo

  • Usuário Ubuntu
  • *
  • Mensagens: 7
    • Ver perfil
Comunicação serial no ubuntu usando java e API RXTX
« Online: 30 de Maio de 2011, 15:19 »
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

Código: [Selecionar]

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
« Última modificação: 30 de Maio de 2011, 16:02 por rribaldo »