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