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 .
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).
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).
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.
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
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:
importgnu.io.CommPortIdentifier;importgnu.io.NoSuchPortException;importgnu.io.PortInUseException;importgnu.io.SerialPort;importgnu.io.UnsupportedCommOperationException;importjava.io.BufferedInputStream;importjava.io.IOException;importjava.io.PrintStream;publicclassPortaSerial{privateSerialPortporta;privateBufferedInputStreamin;privatePrintStreamout;publicstaticfinalintVELOCIDADE_PADRAO=9600;publicstaticfinalintBITS_DADOS_PADRAO=SerialPort.DATABITS_8;publicstaticfinalintBITS_PARADA_PADRAO=SerialPort.STOPBITS_1;publicstaticfinalintPARIDADE_PADRAO=SerialPort.PARITY_NONE;publicstaticfinalintTIMEOUT_PADRAO=1000;publicstaticfinalStringPORTA_PADRAO_WINDOWS="COM1";publicstaticfinalStringPORTA_PADRAO_LINUX="/dev/ttyS0";publicPortaSerial(){Stringosname=System.getProperty("os.name");StringnomePorta;if(osname.startsWith("Windows")){nomePorta=PORTA_PADRAO_WINDOWS;}else{nomePorta=PORTA_PADRAO_LINUX;}abre(nomePorta);}publicPortaSerial(StringnomePorta){abre(nomePorta);}publicPortaSerial(StringnomePorta,inttimeout){abre(nomePorta,timeout);}publicsynchronizedStringrecebe(){try{Stringret="";while(in.available()>0){intlen=in.read();if(len!=-1){ret+=(char)len;}}returnret;}catch(IOExceptionex){thrownewComunicacaoException("Não foi possível receber dados da porta serial.\nVerifique se ela está configurada corretamente.",ex);}}publicsynchronizedStringrecebe(intqtd){try{Stringret="";while(in.available()>0){intlen=in.read();if(len!=-1){ret+=(char)len;}}returnret;}catch(IOExceptionex){thrownewComunicacaoException("Não foi possível receber dados da porta serial.\nVerifique se ela está configurada corretamente.",ex);}}publicsynchronizedvoidenvia(charc){out.print(c);}publicsynchronizedvoidenvia(Stringdados){out.print(dados);}privatevoidabre(StringnomePorta){abre(nomePorta,TIMEOUT_PADRAO);}privatevoidabre(StringnomePorta,inttimeout){try{porta=(SerialPort)CommPortIdentifier.getPortIdentifier(nomePorta).open("conexaoSerial",timeout);setParametros(VELOCIDADE_PADRAO,BITS_DADOS_PADRAO,BITS_PARADA_PADRAO,PARIDADE_PADRAO);in=newBufferedInputStream(porta.getInputStream());out=newPrintStream(porta.getOutputStream());}catch(PortInUseExceptione){thrownewComunicacaoException("A porta "+nomePorta+" está em uso",e);}catch(NoSuchPortExceptione){thrownewComunicacaoException("Porta não encontrada",e);}catch(IOExceptione){thrownewComunicacaoException("Problema na comucação",e);}}publicvoidfecha(){try{if(in!=null){in.close();}if(out!=null){out.close();}if(porta!=null){porta.close();}}catch(IOExceptione){thrownewComunicacaoException("Erro ao fechar porta",e);}}publicvoidsetParametros(intvelocidade,intdados,intparada,intparidade){try{porta.setSerialPortParams(velocidade,dados,parada,paridade);}catch(UnsupportedCommOperationExceptione){thrownewComunicacaoException("Operação não suportada",e);}}@Overridepublicvoidfinalize()throwsThrowable{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.