Comunicação Serial

Prezados colegas,

Estou precisando muito utilizar comunicação serial com Java para enviar e receber dados com um microcontrolador e após ler um bocado de coisas na internet e neste Fórum muita coisa ainda está confusa:

Tem gente que diz que a API JavaComm funciona no Windows XP, outros não; alguns dizem que o que a faz funcionar ou não são lugares para onde vão os arquivos ou linhas extras nos arquivos de configuração; outros dizem que é preciso o RXTX e outros não, enfim, não dá para entender nada!!! Não existe um consenso… já li também o tutorial do GUJ mas não me ajudou em nada porque continuo sem conseguir rodar minha aplicação de teste.

O que entendi até o momento é:

  1. Existem 2 versões da API da Sun JavaComm: a versão 2.0 que suporta somente Win32 (e vem com a tal win32com.dll) mas que parece que não funciona no WinXP e a versão 3.0 que a Sun retirou o suporte ao Windows e que passou a suportar Linux e Solaris (esta versão com shared objects do Linux no lugar da DLL do Windows)…

  2. Existe o RXTX, também freeware porém de terceiros, que possui uma espécie de driver genérico para porta serial tanto no Windows como no Linux e se entendi corretamente, possui também 2 versões, uma que dispensa o uso da JavaComm e outro que a utiliza.

Gostaria que alguém explicasse o seguinte:

  1. O que eu expliquei acima está certo??? Caso não, o que está errado? Alguém seria capaz de fazer um resumo correto e claro sobre isso?

  2. O que eu preciso é desenvolver a aplicação em Windows XP porém quando a mesma estiver pronta, executar em Linux. Qual a melhor opção então?

  3. Eu já alguma coisa das documentações do JavaComm e do RXTX porém são confusos para os meus conhecimentos… alguém saberia explicar, de forma resumida e com passos claros como fazer a instalação correta das APIs?

Desde já agradeço a atenção,

Daniel Cabral

Fala Daniel…

Bom primeiramente a API JavaComm funciona em Windows XP sim…
Tenho uma aplicacao q utiliza JavaComm rodando em XP lendo e enviando dados pela porta serial perfeitamente

A versao q eu utilizo é a 2.0, ela vem com o win32comm.dll…e repetindo, roda no XP

O pessoal geralmente fica com problema na instalacao

Eu utilizo aqui o J2SE 5.0…seguindo esse receitada funciona direitinho ( seguindo a instalacao padrao dos diretorios do JDK 1.5.0)

1-Copia o arquivo win32comm.dll dentro de : C:\Arquivos de programas\Java\jdk1.5.0\bin

2-Copia o arquivo javax.comm.properties dentro de : C:\Arquivos de programas\Java\jdk1.5.0\jre\lib

3-Copia o arquivo comm.jar dentro de : C:\Arquivos de programas\Java\jdk1.5.0\jre\lib\ext

Seguindo essa receita e bolo da certo

Agora é so rodar algum exemplo q venha junto c a API e ver se ta tudo ok

Abracos

Prezado Diogo,

Obrigado pelos esclarecimentos, porém mais uma dúvida ficou: você disse que utiliza a versão 2.0 do JavaComm para trabalhar no Windows (inclusive o XP), porém esta versão não funciona no Linux, correto? Para o Linux eu teria que trocar versão da API para a 3.0, correto?

Eu ontem havia feito testes com a JavaComm no XP e não funcionou - então devo ter cometido erros na instalação. Porém, ontem ainda, eu consegui fazer funcionar o RXTX versão 2.1 (rxtx-2.1-7-bins-r2.zip) - esta versão dispensa o uso do JavaComm e possui drivers de porta serial para Linux, Windows (inclusive funcionando no XP) e Solaris. A princípio então, usarei esta solução do RXTX pois resolveu exatamente o problema (com um único pacote eu posso desenvolver a aplicação no XP e colocá-la em produção no Linux) a única coisa que me deixa com o pé atrás é o suporte - o RXTX não tem documentação (apesar que ele possui as mesmas classes do JavaComm) e o site do fabricante parece ser algo muito amador, do tipo, que um dia desses vai acabar “desaparecendo”… vou tentar mais uma vez então usar o JavaComm fazendo a instalação conforme você explicou e verificar se apenas trocando o JAR das versões 2.0 e 3.0 e a DLL pelo Shared Object do Linux consigo fazer funcionar. De qualquer modo, obrigado mais uma vez pela ajuda. Qualquer dúvida volto
a postar aqui no fórum.

Abraços,
Daniel Cabral

Fala Daniel…

Cara com relacao ao JavaComm no Linux eu nao sei pq nunca utilizei.
Oq posso te dizer eh q conheco uma pessoa q tentou usar e nao conseguiu…mas logico isso nao quer dizer q nao funcione.

Ate pq na documentacao do JavaComm diz q roda no Linux…inclusive nos exemplos q vem c API tem referencias q funciona.

Mas como te disse, nunca tentei fazer funcionar.

RXTX eh uma boa opcao tb cara, mta gente fala dele por aqui…acho q em termos e performance nao deixa adesejar nao

Se tiveres algum problema ainda posta ai

Abracossss

Fala Diogo,

Cara, finalmente consegui fazer tudo funcionar com o JavaComm! Mesmo com suas explicações ainda demorei esses dias até conseguir pois haviam detalhes como por exemplo o fato que eu tenho 3 versões de JDK diferentes na máquina… outro detalhe: se colocar os arquivos nas pastas BIN e LIB do JDK não funciona… tem que ser dentro do BIN e LIB (conforme você explicou) que fica dentro da pasta JRE do JDK (para o caso do ambiente de desenvolvimento). Também fiz testes usando o Eclipse e o netBeans e como não há muito o que configurar nas IDEs (apenas os classpaths) funcionou em ambos sem problemas.

Ficou perfeito agora. Vou abandonar o RXTX e usar o JavaComm. Para o Windows uso a versão 2.0 e para o Linux a versão 3.0. Os próximos passos agora serão fazer vários testes com a classe que estou criando e depois desenvolver o protocolo de comunicação que utilizarei para trocar dados com o microcontrolador. Assuntos que fogem deste Fórum.

Muito obrigado pela ajuda pois como as informações que havia lido até então eram imprecisas não me animei em pesquisar uma solução, mas com a certeza que você passou consegui descobrir todos os detalhes necessários.

Abraços!!!

Daniel Cabral

Kra eu tb to precisando usar a comunicação com a porta serial com java, mas no site da sun só acho a versão 3.0 da JavaComm, alguém poderia me passar os arquivos de instalação da versão 2.0 para windows por favor, o e-mail é thomazjacob@gmail.com… se tiver algum link para o download tb ta blz

Desde já,
Obrigado.

Fala Daniel

Po cara q bom q ta tudo funcionanado ai…tb tive um pouco de dificuldades c JavaComm no comeco e sei como eh q eh. Sucesso na tua aplicacao agora.

Thomaz vou te enviar o Zip do JacaComm 2.0

Abracos pra vcs

Vamos ver se eu ajudo ou pioro as suas dúvidas :lol: :

  • A Javacomm 2.0 é portada para Windows, porém é uma API um pouco antiga, tive problemas com ela, hoje a Javacomm é portada somente para Linux e está na versão 3.x.

  • Eu utilizo a RXTX (ela é portada para Linux e Windows), no meu caso foi mais fácil de instalar e consequentemente mais fácil de utilizar. Hoje eu escrevo e leio na serial sem problemas (Linux e no Windows).

  • No Windows XP vc terá que utilizar um programa chamado UsePort para corrigir uma deficiencia nativa do Windows para a comunicação serial, sem esse app vc terá problemas na comunicação.

  • Em termos de performance ambas são iguais (pelo que pude ver e testar).

  • Em alguns casos a Javacomm 2.0 no Windows não funcionou a contento, por isso migrei para a RXTX e achei melhor.

Qualquer coisa é só gritar.

Valeu Diogo pelo força kra!!!

Já vou começar a fuçar pra ver se funciona… e por falar nisso, alguém ai tem um exemplo de código mais simples para eu poder testar a API no Windows?

:wink:

Da uma olhada nos exemplos q tao dentro da pasta samples no diretorio da API.

Da uma olhada no BlackBox ( acha todas as portas disponiveis e te diz quais tao sendo usadas e quais tao livres ) e no Simple ( te mostra como criar uma classe simples p leitura de dados e outra p escrita de dados)

Abracos

Thomaz, é verdade, a Sun não só abandonou o suporte ao Win32 no JavaComm como sumiu com a versão 2.0 de seu site… o lance é arrumar com alguém e gravar num CD. Parece que o Diogo já te mandou né?

Petter, você poderia ser mais preciso em relação à QUAIS problemas são esses no XP usando o JavaComm que você falou?? O que é esse UsePort? Procurei por esse programa mas não encontrei nada em lugar algum. Por enquanto fiz testes no WinXP e a comunicação serial está funcionando, porém, no meu teste de envio de dados pela serial, apenas envio bytes e não recebo erros… no de receber dados, executo uma thread (conforme os exemplos do JavaComm que o Diogo falou) que escuta a porta serial sem erros, mas ainda não enviei nada para capturar pelo Java. Esta semana estou correndo atrás disso (um teste prático e completo). Meu micro tem várias limitações, entre elas o fato de só possuir 1 porta serial externa. Uma placa PCI com mais portas seriais é muito cara para o momento. Estava tentando testar usando 2 máquinas virtuais (VMWare) conectadas entre si pelas portas seriais virtuais mas não funciona por nada. Mas a culpa não é da minha aplicação pois usei também um software de comunicação pela porta serial (TeraTerm Pro) que SEI que funciona e também não funcionou. Vou abandonar essa idéia da máquina virtual e tentar arrumar um outro micro com um cabo serial ligando 2 portas para testar. Não quero ainda testar com o microcontrolador por enquanto devido à outros detalhes que não vem ao caso citar para não fugir do assunto.

Thomaz, já que você então também precisará trabalhar com a porta serial, se encontrar dificuldades ou conseguir concluir um teste completo (enviando e recebendo os dados em ambos os lados da comunicação) por favor dê um post.

Qualquer novidade que eu tenha avisarei e agradeço se fizerem o mesmo!

Abraço a todos!

Daniel Cabral

Caro Daniel cabral, cara fiquei feliz em ler que vc esta desenvolvendo uma aplicação para comunicação com um microcontrolador, pois tambem estou tentando fazer isso. Minha API esta instalada e funcionando mais recebo dados que não estão lógicos para mim. Meu microcontrolador é um conversor A/D e quero ler dados de 0 a 5 volts na porta serial. Ele possui 10bits isto é envia de 0 a 1024, quero enchergar essa variação, mais o que leio é muito esquisito. Não sabia sobre essa questão de desenvolver o protocolo de comunicação. Vc pode me ajudar falando sobre isso???

Prezado Márcio,

Legal mesmo saber que tem mais alguém tentando fazer algo parecido pois podemos trocar umas idéias a respeito.
Olha só, você NÃO conseguirá ler dados de 0-5 volts na sua porta serial pois esta é uma interface DIGITAL. Mesmo que seu microcontrolador tenha um conversor A/D e você utilize uma saída analógica dele (ou seja, você estará usando uma conversão D/A) conectada à sua porta serial a mesma não irá ler o valor que você quer… a interface serial trabalha com níveis de tensões pre-determinados (no caso, apenas 2 níveis) correspondentes aos valores lógicos 0 ou 1 (ON ou OFF, como queira). Se você informar uma tensão que esteja fora dos padrões pré-determinados a mesma será interpretada como ERRO DE LEITURA e nada chegará à sua aplicação Java. O lance dos 10bits do seu conversor não entra neste caso pois essa é a apenas a resolução que ele usará para converter valores ANALÓGICOS em DIGITAIS. Entendeu? A portal serial do micro trabalha somente com grandezas digitais e não analógicas. Para você passar dados analógicos pra dentro do PC terá que usar uma placa específica para isso como uma “placa de aquisição de dados” ou então (mas não recomendável) uma placa que aceite entrada de dados analógica como a placa de som do PC, que possui entrada analógica (microfone) e possui um conversor A/D. Mesmo assim, no caso da placa de som você ficará limitado aos níveis de tensão permitidos pela placa (que geralmente são poucos) e às frequências que ela usa, que são as frequências usadas pelo som que ouvimos, ou seja, de cerca de 40Hz à 22kHz…

O lance do protocolo de comunicação não sei se ajudará você pois depende do que você queira fazer. No meu caso, o que preciso é usar a interface serial para enviar e receber COMANDOS (digitais) com PARAMETROS (também digitais) para a interface serial disponível no meu microcontrolador. Com esses comandos e parâmetros o software que estará rodando no microcontrolador saberá acionar os recursos desejados, como por exemplo, o uso do PWM para controle de chaves eletrônicas de potência. O protocolo é apenas uma especificação de como ficará dividido os pacotes de bits que são enviados e recebidos entre a aplicação Java e a aplicação que roda no microcontrolador.

Cara, esse assunto já fugiu muito do escopo deste fórum por isso recomendo que se quiser conversar mais sobre isso me mande um email (daniel.cabral@ig.com.br)

Espero ter ajudado.

Quanto aos colegas do Fórum fiquei mais de uma semana sem poder mexer na aplicação e por isso ainda não consegui testar se funcionou ou não na prática a comunicação usando a API JavaComm.

Abraços,
Daniel Cabral

Kra, a parte mais difícil realmnete é a configuração do ambiente. Depois disso pronto, é tranquilo…

Segue um link que tem a configuração em detalhes que funciona blz…

http://www.rafaelquines.com/blog/2007/01/escrevendo-na-porta-serial-com-java/

flw

Boa Tarde pessoal,
Estou desenvolvendo uma aplicação que se comunica pela serial com um uC como alguns postaram aqui tb…
e a eterna duvida de configurar o javacomm :x

eu utilizo jdk1.5 eclipse 3.1
ja coloquei no buildpath… tanto q ele ja reconhece a api… etc…
mas na hora de rodar…

java.io.IOException: Error instantiating class com.sun.comm.Win32Driver com.sun.comm.Win32Driver at javax.comm.CommPortIdentifier.loadDriver(CommPortIdentifier.java:239) at javax.comm.CommPortIdentifier.<clinit>(CommPortIdentifier.java:109) at controle.SerialComm.<init>(SerialComm.java:17) at controle.Stest1.<init>(Stest1.java:15) at controle.Stest1.main(Stest1.java:18)

ja procurei em varios foruns segui varias receitas para instalacao e nada…

win32com.dll ja copiei e renomiei win32comm.dll no desespero ja coloquei tudo na pasta do source tb… fiz varias maneiras e continua no mesmo erro… vou colocar aqui um log dos dos paths dos arquivos…

[b]comm.jar (116KB)
C:\Arquivos de programas\Java\jdk1.5.0_08\jre\lib\ext
C:\Arquivos de programas\Java\jdk1.5.0_08\lib

win32com.dll e win32comm.dll (27KB)
C:\windows
C:\windows\system32
C:\Arquivos de programas\Java\jdk1.5.0_08\bin
C:\Arquivos de programas\Java\jdk1.5.0_08\lib\ext
C:\Arquivos de programas\Java\jdk1.5.0_08\jre\bin
C:\Arquivos de programas\Java\jdk1.5.0_08\lib\ext\

CLASSPATH
C:\Arquivos de programas\Java\jdk1.5.0_08\jre\lib\ext\comm.jar;

javax.comm.properties
C:\Arquivos de programas\Java\jdk1.5.0_08\jre\lib
C:\Arquivos de programas\Java\jdk1.5.0_08\lib\

conteudo do javax.comm.proprieties
#Windows Serial Driver

Driver=com.sun.comm.Win32Driver[/b]

já estou perdendo bastante tempo com isso alguem poderia me ajudar???

vlw
galera
[]s

procurei em varios lugares

Kra, seguinte, não vi você especificar ae o sua JRE. Não apenas a JRE dentro de sua JDK, mas vc deve ter também a JRE, que é que o Eclipse deve estar usando para executar seu programa. Dê uma olhada nisso. blz…

flw

Cara, deve ser algum detalhe muito simples. Essas “milhares” de receitas de bolo espalhadas pela net só confundem. Eu estou conseguindo usar a API sem quaisquer problemas (atualmente estou com NOVOS problemas, rs).

1º - você não precisa renomear a dll
2º - você não precisa copiar milhares de vezes os arquivos para esse monte de pastas. O correto é o seguinte:

a) comm.jar --> fica dentro de …\JDK\JRE\LIB\EXT
b) javax.comm.properties --> fica dentro de …\JDK\JRE\LIB e deve ter a linha extamente como você colocou (versão Windows)
c) win32com.dll --> fica dentro de …\JDK\JRE\BIN

Feito isto basta adicionar no Eclipse o comm.jar (NÃO PRECISA MEXER NO CLASSPATH pois usando essas pastas “padrões” o Eclipse encontra as bibliotecas - teoricamente mexendo no classpath você conseguiria colocar onde quisesse os arquivos, mas tentei bastante fazer isso e não sei porque não funcionou).

A princípio isso é suficiente para a API funcionar. Porém, o que o colega aí em cima postou também é importante. CASO VOCÊ TENHA MAIS DE UM JDK (e consequentemente JRE também) INSTALADO EM SUA MÁQUINA, verifique qual deles que o Eclipse está usando NO PROJETO EM QUE VOCÊ QUER USAR A API. Precisa ser a mesma versão de onde você copiou os arquivos do JavaComm.

Se nem assim funcionar, verifique ONDE VOCÊ ARRUMOU ESSE JAVACOMM. A Sun não disponibiliza mais a versão 2.0 do JavaComm, que é a única que funciona em plataforma Win32. Porém, nem mesmo o download da JavaComm 2.0 a Sun disponibiliza em seu site. Essa versão SUMIU do mundo oficial e hoje só pode ser arrumada através de outras pessoas ou sites não-oficiais. A versão atual, 3.0, que é única que a Sun dispoibiliza e dá suporte teoricamente é multiplataforma e PODE até funcionar em Win32 mas neste caso você vai ter que se virar em desenvolver/adaptar o driver, o que fica inviável pois desviaria o foco dos nossos projetos. Não tente então MISTURAR as versões, tipo, usando a versão 3.0 e pegando “por fora” a DLL da versão 2.0. Haverá enormes chances de dar zebra. Descole a versão 2.0 original.

Boa sorte, qualquer coisa escreva de novo aqui.

Mudando um pouco de assunto agora, qual o microcontrolador que você usa? É da família 56F80xx da Freescale (Motorola)??? Estou tendo novos problemas para tocar meu projeto e praticamente não existem fórums para se trocar idéias sobre esses assuntos muito específicos.

Um abraço,
Daniel Cabral

Amigos estou com um problema semelhante…
Instalei a API COMM 2.0
Maquina instalada j2re1.4.2_12
Estou usando o RWindows com service pack 2

Consegui listar as portas disponiveis , mas quando tento abrir alguma da um erro relacionado permissão…
Aguém tem um script simples que ler a porta serial , abre e escreve na saída um string qualquer…???

Então cabral obrigado pela dica , vou tentar arrumar aqui, ah sim sem duvidas tem a jre instalada tb mas isso eu já tinha configurado no eclipse…

sacanagem essa api da sun… achei q ela dava suporte a coisas mais antigas hehehhe…

mas sobre o uC aqui utilizamos MC9S12XXXX (antigo HCS12)
realmente essa parte de uC nao tem mtos foruns…

pessoal vlw pela dica qualquer coisa eu posto aqui novamente

[]s

[quote=cabral_]Cara, deve ser algum detalhe muito simples. Essas “milhares” de receitas de bolo espalhadas pela net só confundem. Eu estou conseguindo usar a API sem quaisquer problemas (atualmente estou com NOVOS problemas, rs).

1º - você não precisa renomear a dll
2º - você não precisa copiar milhares de vezes os arquivos para esse monte de pastas. O correto é o seguinte:

a) comm.jar --> fica dentro de …\JDK\JRE\LIB\EXT
b) javax.comm.properties --> fica dentro de …\JDK\JRE\LIB e deve ter a linha extamente como você colocou (versão Windows)
c) win32com.dll --> fica dentro de …\JDK\JRE\BIN

Feito isto basta adicionar no Eclipse o comm.jar (NÃO PRECISA MEXER NO CLASSPATH pois usando essas pastas “padrões” o Eclipse encontra as bibliotecas - teoricamente mexendo no classpath você conseguiria colocar onde quisesse os arquivos, mas tentei bastante fazer isso e não sei porque não funcionou).

A princípio isso é suficiente para a API funcionar. Porém, o que o colega aí em cima postou também é importante. CASO VOCÊ TENHA MAIS DE UM JDK (e consequentemente JRE também) INSTALADO EM SUA MÁQUINA, verifique qual deles que o Eclipse está usando NO PROJETO EM QUE VOCÊ QUER USAR A API. Precisa ser a mesma versão de onde você copiou os arquivos do JavaComm.

Se nem assim funcionar, verifique ONDE VOCÊ ARRUMOU ESSE JAVACOMM. A Sun não disponibiliza mais a versão 2.0 do JavaComm, que é a única que funciona em plataforma Win32. Porém, nem mesmo o download da JavaComm 2.0 a Sun disponibiliza em seu site. Essa versão SUMIU do mundo oficial e hoje só pode ser arrumada através de outras pessoas ou sites não-oficiais. A versão atual, 3.0, que é única que a Sun dispoibiliza e dá suporte teoricamente é multiplataforma e PODE até funcionar em Win32 mas neste caso você vai ter que se virar em desenvolver/adaptar o driver, o que fica inviável pois desviaria o foco dos nossos projetos. Não tente então MISTURAR as versões, tipo, usando a versão 3.0 e pegando “por fora” a DLL da versão 2.0. Haverá enormes chances de dar zebra. Descole a versão 2.0 original.

Boa sorte, qualquer coisa escreva de novo aqui.

Mudando um pouco de assunto agora, qual o microcontrolador que você usa? É da família 56F80xx da Freescale (Motorola)??? Estou tendo novos problemas para tocar meu projeto e praticamente não existem fórums para se trocar idéias sobre esses assuntos muito específicos.

Um abraço,
Daniel Cabral
[/quote]

Daniel, obrigado pela dica
encontrei o javacomm 2.0
está nesse link aqui
http://wind.lcs.mit.edu/download/java/javacomm20-win32.zip

fiz oq vc falou… e também copiei o win32com.dll para \jdk\bin
agora sim!!

vlw !!!

Depois dessa eu até vou escrever um how to por causa dessa porcaria viu hahahah

[]s

Caio Pereira