Javacomm

Oi pessoal, eu to com um probleminha aqui usando o Javacomm, acontece que “as vezes” eu consigo conectar na serial e ate mesmo receber alguns caracteres que eu envio, mas nao todos e nem sempre consigo receber algo, ja olhei alguns exemplos inclusive os que vem junto a API, mas nao consigo descobrir o porque deste problema, aqui vai o codigo que estou usando:

[code]import javax.comm.*;

import java.io.*;

import java.util.*;

public class Conexao implements SerialPortEventListener, CommPortOwnershipListener {

private InputStream is;

private OutputStream os;

private SerialPort sPort;

private CommPortIdentifier portID;

private Thread tLeitura;

private boolean open;

public Conexao(){

this.open = false;

}

public void abrirConexao(){

try {

portID = CommPortIdentifier.getPortIdentifier(“COM3”);

} catch (Exception e){

System.out.println(“Não encontrei esta porta.”+e);

}

try {

sPort = (SerialPort)portID.open(“Tst”,30000);

} catch (Exception e){

System.out.println(“Erro:”+e);

}

try {

setarParametros();

} catch (Exception e){

sPort.close();

System.out.println(“Erro ao setar os parametros.”);

}

try {

is = sPort.getInputStream();

os = sPort.getOutputStream();

} catch(Exception e){

sPort.close();

System.out.println(“Erro ao pegar os fluxos de IO”);

}

try {

sPort.addEventListener(this);

} catch (Exception e){

sPort.close();

System.out.println(“Erro:”+e);

}

sPort.notifyOnDataAvailable(true);

sPort.notifyOnBreakInterrupt(true);

try {

sPort.enableReceiveTimeout(3000);

} catch (Exception e){

}

portID.addPortOwnershipListener(this);

open = true;

}

public void fecharConexao(){

if (!open){

return;

}

if (sPort != null){

try {

os.close();

is.close();

} catch (Exception e) {

System.out.println("Erro ao fechar os fluxos. "+e);

}

sPort.close();

portID.removePortOwnershipListener(this);

}

open = false;

}

public boolean isOpen(){

return open;

}

public void enviarString(String msg){

try {

os.write(msg.getBytes());

//System.out.println("Enviei: "+msg);

} catch (IOException e) {

System.out.println(“Erro ao escrever no fluxo de saida”+e);

}

}

public void setarParametros(){

try {

sPort.setSerialPortParams(9600,sPort.DATABITS_8,sPort.STOPBITS_2,sPort.PARITY_NONE);

} catch (UnsupportedCommOperationException e) {

System.out.println(“Parametros incorretos”+e);

}

}

public void serialEvent(SerialPortEvent se) {

StringBuffer buff = new StringBuffer();

int novoDado = 0;

switch (se.getEventType()){

case SerialPortEvent.DATA_AVAILABLE:

System.out.println(“Estou dentro do evento.”);

while (novoDado != -1){

try {

novoDado = is.read();

if (novoDado == -1){

break;

}

if (’
’ == (char)novoDado){

buff.append(’
');

} else {

buff.append((char)novoDado);

}

} catch (Exception e) {

System.out.println("ERRO: "+e);

return;

}

}

System.out.println("RECEBI: "+new String(buff));

break;

case SerialPortEvent.BI:

System.out.println("
— BREAK RECEIVED —
");

break;

}

}

public void ownershipChange(int o) {

}

}[/code]

desde já, agradeço a todos por sua atenção e ajuda.

Comunicação serial é meio chato mesmo (já pastei muito com isso…), normalmente para ter menos problemas você deve arranjar um “data analyzer” para ver exatamente o que está sendo enviado e recebido.

(Às vezes você está até enviando direitinho, mas o equipamento é meio molenga e precisa de um delay entre os bytes, e não consegue responder de volta…)

Se conseguir trabalhar com uma velocidade menor no princípio, é melhor (2400 bps); e se for o caso até ponha um delay entre os bytes (dependendo do equipamento você precisa disso…) depois vá aumentando a velocidade, para entender o que está acontecendo.

O Data Analyzer pode ser um equipamento (um pouco caro, que funciona a pilhas e basicamente mostra os sinais e os bytes que estão sendo enviados e recebidos) ou um outro computador com um cabo especial que você deve ligar à serial, ou então você pode usar um programa chamado portmon, que você obtém no site http://www.sysinternals.com e é “na faixa”. (Como você escreveu “COM3” suponho que você está usando Windows…)

Não sei se alguém aluga (ou empresta) um equipamento desses.

Não digo que o portmon seja sua primeira opção (só porque é de graça e você não precisa soldar nada…), porque ele não consegue mostrar certas coisas que um verdadeiro data analyzer consegue. Mas pode ser que para coisas simples você já consiga ter uma boa pista com o portmon.

dica quente:
baixa a implementação da javacomm do site: www.rxtx.org/
tem versões para alguns SOs, e tem uma versao compativel com javacomm e outra “semi compativel” muito boas, a segunda achei até mais fácil de utilizar :wink:

Pessoal, valew ai pelas dicas e sugestões, o problema estava apenas no recebimento dos dados, mas ja consegui resolver este, to fazendo isso para um trabalho da faculdade, enviar um arquivo pela serial, ai quando tiver terminado eu coloco aqui o codigo para quem quiser dar uma olhada ou fazer alguma modificação.

De que tipo de equipamento se trata?

Entre dois PC´s mesmo, bom para testar estou enviando para a porta do modem ou entao jumpeando os pinos 2 e 3 da saida serial.

Ola Carlos… Estou desenvolvendo um trabalho na faculdade tambem, tenho q desenvolver um protocolo, tenho que transferir um arquivo tb, se possivel gostaria que postasse seu trampo, agradeço desde já!