Duvidas na Comunicação Serial em Java

11 respostas
m_scena

Olá galera!!

sei que esse assunto dá muito pano pra manga e que existem varios topicos sobre o assunto, mas as minhas duvidas eu ainda nao vi em nenhum deles. Antes de tudo, peço desculpa se vier a mencionar alguma besteira em relação a hardware (nao eh muito o meu forte). Bom vou ao que interessa, estou tendo realizar a comunicação serial em Java no WinXP, e já tentei utilizar tanto a JavaComm quanto a RXTX , mas nao estou conseguindo realizar a leitura em um porta serial. A instalação esta OK, pois já executei o exemplo BlackBox e outro para encontrar as portas existentes no computador. A minha duvida mesmo é se eu posso realizar a escrita e leitura apenas na porta do meu computador (i.e. - sem estar conectado a outro dispositivo), estou achando que na hora que escrevo os dados na porta, esses ja sao perdidos e por isso não é possivel realizar a leitura.
Um professor me pediu que eu realiza-se a comunicação entre dois computadores conectados pela porta serial, o problema é que esses cabos estao dificies de se encontrarem hoje (eh claro q tem pela net, mas leva um tempo pra receber). Em relação a conectar dois computadores pela porta serial, eles devem estar no mesmo tipo de porta, tipo db9 pra db9 ou pode ser um db9 pra db25 por exemplo. Agradeço quem teve paciencia de ler tudo e aqueles que puderem me ajudar fico agredecido :smiley: .

p.s. utilizei tambem o programa UserPort

11 Respostas

moonsite

m_scena,

Vamos por partes:

  1. Sobre ler / escrever na porta serial.
    O que você envia para a porta não volta pela mesma porta, a não ser que você coloque nela um cabo de loopback ou um micro que rode um software que faça essa tarefa.
    Ou seja: Enviou para a porta, quem recebe é quem está conectado nela.
    Esse cabo de loopback pode ser interessante para testar. Ele é apenas um cruzamento entre a via de transmissão (TX) e de recebimento (RX). Com ele ligado na porta, tudo que você envia volta pela mesma porta e é recebido pelo seu programa (acho que era isso que você queria).

  2. Sobre o cabo serial.
    Não tem mistério. Se a biblioteca que você está usando (não conheço) não precisa das vias de sinalização, vai funcionar com apenas três fios. O jeito mais fácil de descobrir é testando.

Faça o seguinte:
a) Consiga um mouse serial vítima (que você possa estragar).
b) Desmonte e desconecte o cabo da placa de circuito.
c) Desmonte o conector de plástico que encaixa na placa (não é o que liga no micro!!! É o do lado do mouse). Você vai tirar do plástico os conectores de metal, separando fio por fio (sem tirar a ponteira de metal do fio!!!).
d) Com um multímetro (ou lâmpada, pilha e paciência), descubra qual fio está ligado em qual pino do DB9 (lado do micro). Um clips entortado ajuda na hora de testar o conector do lado do micro.

Esses conectores de metal encaixam certinho nos pinos da porta serial. Não precisa ter medo porque não tem perigo se encostar um no outro. Não queima nada. Mas durex ou fita isolante ajudam.
Pra fazer um loopback, ligue o cabo no micro e feche um curto entre os pinos 2 e 3.
Pra ligar em outro micro, ligue o pino 5 origem no pino 5 destino, o 2 de origem no 3 de destino e o 3 de origem no 2 de destino.
O pino 5 é o comum (GND, vulgo terra). O 2 é recebimento (RX) e o 3 transmissão (TX).

Mais informações: http://www.lammertbies.nl/comm/cable/RS-232.html

Boa sorte!

m_scena

Vlw moonsite pela sua resposta,

vou ver se consigo arranjar um mouse desse pra testar. Mais uma pergunta, se eu utilizar dois computadores (um enviando e outro lendo pela serial) daria para fazer esse teste tambem, não é? A duvida é se eles podem estar ligados por conectores seriais diferentes, tipo a saida do computador 1 é um db9 e da do computador 2 uma db15 ou db 25 (uma entrada de impressora), ou necessariamente devem estar ligados pelo mesmo tipo de conector. Estou perguntando isso pela dificuldade em encontrar cabo db9-db9.

Abração

lucianotome

Cara, se voce usa o windows xp acho que vc pode usar uma porta virtual, eu uso uma pra fazer comunicacao com uma impressora fiscal virtual, “Virtual Serial Port Driver 6.0”, http://superdownloads.uol.com.br/download/174/virtual-serial-ports-driver-xp/

Luca

Olá

Sim, as extremidades podem ser diferentes.

Você está em SP? Tenho um monte de cabos destes e também adaptadores do tempo em que desenvolvi programas (em C e em Assembler) que faziam justamente isto que seu professor pediu. Me mande uma MP caso esteja interessado em cabos ou adaptadores.

[]s
Luca

Preco

Tu pode montar um db9/db9 usando dois mouses vítima eheheh

Aqui mostra como dá pra fazer isso…
http://www.rogercom.com/PortaSerial/NullModemDB9-DB9.gif

Sobre a comunicação serial, uso a biblioteca RXTX aqui no meu trampo, e funciona direitinho… \o/ Só ler os tutoriais dos caras lá q tu consegue fazer =D
Aqui tem uma classe que a gente usa pra fazer a conexão:

import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.UnsupportedCommOperationException;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.PrintStream;


public class PortaSerial {
    
    private SerialPort porta;
    private BufferedInputStream in;
    private PrintStream out;    
    
    public static final int VELOCIDADE_PADRAO = 9600;
    public static final int BITS_DADOS_PADRAO = SerialPort.DATABITS_8;
    public static final int BITS_PARADA_PADRAO = SerialPort.STOPBITS_1;
    public static final int PARIDADE_PADRAO = SerialPort.PARITY_NONE;
    public static final int TIMEOUT_PADRAO = 1000;
    
    public static final String PORTA_PADRAO_WINDOWS = "COM1";
    public static final String PORTA_PADRAO_LINUX = "/dev/ttyS0";    
    
    public PortaSerial(){
        String osname = System.getProperty("os.name");
        String nomePorta;
        if(osname.startsWith("Windows")){
            nomePorta = PORTA_PADRAO_WINDOWS;
        }
        else{
            nomePorta = PORTA_PADRAO_LINUX;
        }        
        abre(nomePorta);        
    }
    
    public PortaSerial(String nomePorta){
        abre(nomePorta);
    }
    
    public PortaSerial(String nomePorta, int timeout){
        abre(nomePorta, timeout);
    }
    
    
    
    public synchronized String recebe(){
        try {
        	String ret = "";
            while (in.available() > 0) { 
            	int len = in.read();
            	if (len !=-1) {
            		ret += (char)len;
            	}
            }
            return ret;
        } catch (IOException ex) {
            throw new ComunicacaoException("Não foi possível receber dados da porta serial.\nVerifique se ela está configurada corretamente.", ex);
        }
    }
    
    public synchronized String recebe(int qtd){
        try {
        	String ret = "";
            while (in.available() > 0) { 
            	int len = in.read();
            	if (len !=-1) {
            		ret += (char)len;
            	}
            }
            return ret;
        } catch (IOException ex) {
            throw new ComunicacaoException("Não foi possível receber dados da porta serial.\nVerifique se ela está configurada corretamente.", ex);
        }
    }
    
    public synchronized void envia(char c){
        out.print(c);
    }
    
    public synchronized void envia(String dados){
        out.print(dados);
    }
    
    private void abre(String nomePorta){
        abre(nomePorta, TIMEOUT_PADRAO);
    }
    
    
    private void abre(String nomePorta, int timeout){
        try {
            porta = (SerialPort) CommPortIdentifier.getPortIdentifier(nomePorta).open("conexaoSerial", timeout);
            setParametros(VELOCIDADE_PADRAO, BITS_DADOS_PADRAO, BITS_PARADA_PADRAO, PARIDADE_PADRAO);
            
            in = new BufferedInputStream(porta.getInputStream());
            out = new PrintStream(porta.getOutputStream());
        } catch (PortInUseException e) {
            throw new ComunicacaoException("A porta " + nomePorta + " está em uso", e);
        } catch (NoSuchPortException e) {
            throw new ComunicacaoException("Porta não encontrada", e);
        }catch (IOException e) {
            throw new ComunicacaoException("Problema na comucação", e);
        }
    }
    
    public void fecha(){
        try {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
            if (porta != null) {
                porta.close();
            }
        } catch (IOException e) {
            throw new ComunicacaoException("Erro ao fechar porta", e);
        }
    }
    
    public void setParametros(int velocidade, int dados, int parada, int paridade){
        try {
            porta.setSerialPortParams(velocidade, dados, parada, paridade);
        } catch (UnsupportedCommOperationException e) {
            throw new ComunicacaoException("Operação não suportada", e);
        }
    }
    
    @Override
    public void finalize()throws Throwable{
        fecha();
    }
    

}

Espero que ajude.
[]'s

m_scena

vlw lucianotome, Luca e Preco pelas respostas!!

acho q eu viajei no assunto, pq estava tentando escrever e ler na mesma porta e as suas resposta me tirarão essa duvida, que eh preciso escrever p/ um dispositivo e ler de um dispositivo. Sobre a API que uso, já usei tanto a JavaComm, quanto a RXTX pra rodar os exemplos (os SimpleRead/Write que vem no samples da JC, e os do tutorial do GUJ).
Luca te respondendo a sua pergunta, nao estou em SP, mas em Natal. Já procurei nas lojas por aki, mas é dificil achar esse tipo de cabo, no maximo que encontrei foi um para conectar impressora (que se nao me engano era db9-db15).
A verdade é que estou realizando um trabalho de graduação. A proposta é desenvolver uma aplicação para ler os dados de uma maquina que testa a resistencia de um material e envia os dados via porta serial.

agradeço a todos pelas respostas…

Luca

Olá

Então… repito, me manda uma MP com seu endereço, etc e tal que te mando um cabo.

[]s
Luca

m_scena

lucianotome,

teria como receber algum dados por essa porta serial virtual para realizar a leitura com a API?

vlw

moonsite

m_scena,

As portas com conectores DB9 e DB25 são 100% compatíveis (são a mesma coisa). Só muda a pinagem. Pra ligar uma na outra, confira no site a pinagem e faça a regrinha: GND com GND, TX com RX e RX com TX. Acho que no próprio site tem o diagrama.

Já a porta DB15 é pra joystick e/ou MIDI. Não serve pra você.

Abraço.

lucianotome

Cara foi como eu falei, ele cria uma porta virtual tipo com5 e com6, ai vc manda a comunicacao pela com5 e recebe na com6, vc manda na com 6 e recebe na com5, aqui nos meus teste funciona

m_scena

Vlw a todos pelas respostas e por responder as minhas duvidas. Vou partir pra prática pra ve como fica, qlqer coisa mando um alo.

abraço a todos!!

Criado 30 de julho de 2008
Ultima resposta 1 de ago. de 2008
Respostas 11
Participantes 5