Porta Serial & Java 12 Jan 2007 07:23
Escrevendo na Porta Serial com Java
Há algumas semanas, no meu emprego, precisei desenvolver um programa que interagisse com um equipamento, tudo pela porta serial. Fui pesquisar na internet, e ouvi falar sobre a Java COMM que permite a escrita. Levei algumas horas para entender o funcionamento dela, o que tive mais problemas realmente, é de como montar a estrutura da aplicação para poder fazer funcionar.
Em primeiro lugar, o pacote para windows acompanha 3 arquivos: javax.comm.properties, win32com.dll e a comm.jar. Aí está a maior dificuldade. Mas como já tive muitos problemas com isso, vou direto ao ponto certo. O supondo que a variável $JDK se ja o diretório onde está instalado sua JDK e $JRE onde está sua JRE, siga os seguintes passos:
Arquivo win32comm.dll => $JDK/bin, $JDK/jre/bin, $JRE/bin
Arquivo javax.comm.properties => $JDK/lib, $JDK/jre/lib, $JRE/lib
Quanto à comm.jar, é só colocá-la no classpath de sua aplicação. no site do GUJ tem uma ótimo artigo sobre como escrever na porta serial usando a Java Comm que serviu como base para meus estudos.
Se alguém precisar de alguma ajuda na parte programacional dessa API, pode me contatar que tranquilamente responderei as questões.
Mas voltando ao assunto do blog, comecei a me interessar sobre como funcionava as portas de comunicação do micro. Pesquisei com amigos da área, e descobri que a porta serial se comunica através de um tipo de Código Morse, ou seja, de x em x tempos, ela dá o pulso com Y volts, ou com 0 volts. Assim, a parte que estará lendo, deverá estar escutando na mesma velocidade da escrita. É mandado um pulos de 0 volts, entao o leitor sabe que este é o START BIT, informando que a escrita irá começar. Depois, sção escritos 8 valores (correspondem aos 8 bits) que a parte que estará lendo monta o byte completo depois do STOP BIT de fim do byte. Claro que isso tudo acontece numa velocidade na casa dos microsegundos.
Mas percebi que seria muito complicado fazer uma placa para entender essas leituras. Foi então que fui pesquisar sobre a porta paralela, que como vi na revista Eletrônica Total A porta paralela tem 8 pinos que formam um byte completo. O byte é decifrado testando se há tensão nos pinos. Se houver, entao seria o BIT 1, caso contrário, seria o BIT 0. Com isso, para escrever o valor 10 na porta paralela, seria necessário escrever: 0 0 0 0 1 0 1 0 = 10.
Compare Preços de: placa, leds, porta serial, java, eletrônica
Adicione ao del.icio.us

em 26 Feb 2007 as 10:35 am 1.Thomas disse …
Olá colega Rafael tudo bom? Ví seu artigo sobre a Java Comm, estou também precisando usar essa API vc tem algum exemplo como realizar “conversas” simples entre 2 pc’s usando ela? Se vc pode me ajudar eu agradeço desde já a atenção. Abraços, parabens pela fonte de informações
em 26 Feb 2007 as 5:56 pm 2.Rafael Quines disse …
Kra, ali mostrei um exemplo para fazer a escrita na porta serial. Já conseguiu fazer isso? no tutorial do GUJ (AQUI) tem exataente o que vc precisa. Seria só adaptar o código para o seu objetivo..
Qualquer dúvida, é só postar..
flw
em 25 Mar 2007 as 11:03 am 3.Rafael Quines » Módulo GPS - O que é? disse …
[…] Um bom experiemento, para quem tiver acesso a um módulo GPS, é ligar na porta serial do micro a abrir o HyperTerminal para ver as informações passadas. Esteja certo que o padrão utilizado no módulo é RS232, caso contrátio, a porta serial do computador não conseguirá decifrar as mensagens. Se desejar trabalhar com a porta serial num programa Java, segue o tutorial para isso. Se quiser ler a documentação do módulo ET102, clique aqui. […]
em 27 Mar 2007 as 8:58 am 4.Eduardo Lazarini disse …
Olá Rafael, tudo bem? estou talvez com o mesmo problema que você teve, não consigo comunicar meu programa Java com uma porta serial no win98, não consigo faze-lo comunicar-se com outra maquina. Veja se você tem alguma dica para me ajudar. Obrigado mesmo
em 27 Mar 2007 as 9:11 am 5.Rafael Quines disse …
Certo, mas poderia ser mais específico? Tá dando que erro??? Certifique-se que a dll esteja nas 3 pastas: $JDK/bin, $JDK/jre/bin, $JRE/bin; e a comm.jar e o javax.comm.properties estejasm em $JDK/lib, $JDK/jre/lib, $JRE/lib.
$JDK -> Direório onde está instalado seu JDK
$JRE -> Direório onde está instalado seu JRE
manda o erro ae pra mim analisar.. flw
em 27 Mar 2007 as 9:28 am 6.Eduardo Lazarini disse …
Rafael, desde já muito obrigado por se prontificar para ajudar. Eu realmente não coloco nas 3 pastas, vou fazer este teste, obrigado. Para ser mais específico, quando eu compilo não da erra, porém ele não identifica a porta serial, diz que não existe. Vamos fazer assim, o meu e-mail é dulazarini@gmail.com, se você puder me mande um e-mail que vou te passando o que acontece e quando você puder, você me responde. Se puder passe também seu msn. Mais uma vez muito obrigado mesmo pela ajuda. Abraço
em 27 Mar 2007 as 10:34 am 7.Rafael Quines disse …
Te liga, de repente é importante, a primeira coisa a fazer é usar um comando para listar as portas disponíveis no pc. isso é muito fácil fazer.. segue:
Enumeration listaPortas = CommPortIdentifier.getPortIdentifiers();
while (listaPortas.hasMoreElements()) {
CommPortIdentifier ips = (CommPortIdentifier)listaPortas.nextElement();
System.out.println(”Porta encontrada: ” + ips.getName());
}
faça isso pra ver se roda tranquilo…
em 27 Mar 2007 as 10:38 am 8.Eduardo Lazarini disse …
Como você me perguntou:
Win98
C:\j2sdk1.4.2_02\bin
” ” ” ” “\lib
” ” ” ” “\JRE
Win XP
C:\sun\appserver\jdk\bin
” ” ” ” \lib
” ” ” \jre\bin
” ” ” ” \lib
Quando eu compilo não dá erro, porém não reconhece a porta serial, não comunicam-se, diz que não existe porta.
Mais uma vez obrigado
Abraços
em 27 Mar 2007 as 10:39 am 9.Eduardo Lazarini disse …
agora que vi sua resposta… mais uma vez obrigado, vou dar uma olhada peraí ehehehe…
em 27 Mar 2007 as 11:09 am 10.Eduardo Lazarini disse …
Respondi no seu e-mail já. Parabéns pelo blog !!
em 27 Mar 2007 as 3:29 pm 11.Rafael Quines disse …
Kra, poderia me mostrar seu código?? Se tá dando NullPointerException, deve ser erro na configuração. de repente vc pode estar colocando a dll no JDK errado, só tem 1 JDK instalado na máquina???
Ah, uma coisa importante, nunca fiz funcionar em WIN98. só xp… Só para deixar claro…
flw
em 28 Mar 2007 as 12:28 pm 12.Eduardo Lazarini disse …
Parceiro, funcionou perfeito, como vc orientou… Olha, muito obrigado mesmo, suas dicas e conselhos foram essenciais e ter encontrado esse seu blog foi o caminho de tudo ehhehe… Estou rodando o programa em win98… pode ser então que funcione da mesma maneira para as 2 plataformas… mais uma vez muito obrigado, com certeza vamos entregar nossa projeto e será um sucesso.
em 28 Mar 2007 as 12:44 pm 13.Rafael Quines disse …
Hehe. blz… Q bom que funcionou legal. Em XP é a mesma coisa. Se Win98 funcionou legal, já eraz. 98 pra cima é tranquilo. o importante é a configuração do ambiente… Dlls, jars, etc..
Flww
em 31 Mar 2007 as 6:01 am 14.Eduardo Lazarini disse …
Conseguimos compilar (javac) o programa no win XP, porem não conseguimos rodar o programa (java), como devo agir? Deve estar faltando apenas um detalhe…
Mais uma vez muitissimo obrigadooooooooo
em 31 Mar 2007 as 6:18 am 15.Eduardo Lazarini disse …
entao mais especificamente é q nao esta lendo nem gravando os arquivos class do java… como faço?
em 31 Mar 2007 as 10:53 am 16.Rafael Quines disse …
Kra, vc deve configurar a variável PATH do WINDOWS. é só adicionar o diretoriodo jdk instalar + /bin, que é o caminho onde encontra-se o executável javac. Valeu. Flw
em 20 Apr 2007 as 6:51 am 17.Jean disse …
Olá Rafael tudo tranquilo?
Procurei no site inteiro da sun mas só consegui achar javacomm para solaris, linux e generic. Baixei a generic e só veio o arquivo comm.jar. O win32comm.dll e o javax.comm.properties não estão lá.
Onde baixar esses arquivos?
Valeu, abraço cara
em 20 Apr 2007 as 7:57 am 18.Rafael Quines disse …
Bom kra, nem me lembro de onde baixei essa versão pra Windows. To disponibilizando no meu site. Baixe e use essa versão com a DLL e o properties. BAIXE AQUI
Flw
em 27 Apr 2007 as 2:33 pm 19.Jean disse …
Show de bola…
Valeu cara muito obrigado mesmo!
em 27 Apr 2007 as 7:16 pm 20.Rafael Quines disse …
Blz.. Qq coisa q precisar é só falar… Flw
em 04 May 2007 as 10:15 am 21.Fábio Curtis Volpe disse …
Boa tarde, tudo bem com você?
Pequei o seu tutorial sobre Comunicação Serial Utilizando a API da SUN, e estou com algumas dúvidas, será que poderia me ajudar?
A dúvida está na hora de receber os dados pela porta serial, pois enviar está funcionando certinho. O que estou tentando fazer é o seguinte, pegar a data e hora do SO e enviar através da serial para um PIC, para teste estou usando o hyperterminal do windows xp, na hora que mando enviar ele exibe certinho no hyperterminal a data e hora, só que na hora que pelo hyper terminal uma mensagem data e hora ele exibe letra por letra em linhas separadas, só que eu queria que ficasse tudo na mesma linha.
Uma coisa que percebi é que ele monta mensagem de 8 caracteres por vez, mas a minha mensagem tem 33 caracteres, daí ele divide em 4 linhas de 8 caracteres, queria que ficasse todas na mesma linha.
O tutorial que me basiei é esse: http://www.guj.com.br/content/articles/javacommapi/JavaCommAPI.pdf
em 04 May 2007 as 10:33 am 22.Rafael Quines disse …
e ae Fábio. legal este seu problema. Tive o mesmo problema. E resolvi da seguinte forma. Você, qnd vai ler da serial, está dentro de um while(entrada.avaible() > 0) certo???
O que eu fiz, é dar 3 tentativas e não confiar fielmente no avaible(). Pois se o PIC está escrevendo , por exemplo, RAF, vc leu já o RAF e o avaible vai pro 0 até que o PIC escreve o resto AEL. Vc, na verdade, não está dando tempo para ele escrever. O interessante é fazer assim:
int tentativas = 3;
while(tentativas > 0) {
nodeBytes += entrada.read(bufferLeitura);
} else {
tentativas–;
try {
Thread.sleep(250);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Desta maneira, vc estará dando mais tempo pro PIC escrever na SERIAL. E vai concatenando a medida que o avaible estiver > 0 entende. Depois disso, deve trabalhar em cima desse sleep para se adequar ao seu PIC. Ou achar um meio termo..
T+
em 10 Jun 2007 as 5:22 pm 23.Cesar disse …
Olá Rafael.
Parábens pelo blog, está muito legal.
Não sou programador, mas estou precisando de uma mãozinha sobre java para concluir meu projeto de formatura da faculdade.
Tenho que comunicar um Palm Tungsten TX com um leitor de código de barras pela porta serial, como o leitor utiliza porta RS232 tive que aplicar um circuito com o IC MAX232 para converter o nível de tensão para TTL, mas agora preciso fazer um pequeno programa para habilitar a porta serial da Palm e receber a String do código de barras.
Será que você teria alguma dica para eu poder executar essa última parte?
Fico grato desde já por receber sua atenção.
Cesar
em 10 Jun 2007 as 5:36 pm 24.Rafael Quines disse …
Olá. Mto obrigado. Atualmente estou bem sem tempo de escrever novos posts aqui no blog, mas acredito que essa semana estarei mais disponível.
Sobre a seu problema, acredito que você deveria desenvolver algo em J2ME, que é uma versão do Java aplicável a dispositivos móveis, no caso, deveria rodar no seu Palm.
Dá uma olhada nesse link do JavaFree:
http://www.portaljava.com/home/modules.php?name=Forums&file=viewtopic&t=24722&highlight=
valeu. flw
em 19 Jul 2007 as 1:05 pm 25.Daniel Cabral disse …
Prezado Rafael, parabéns pelo artigo que está muito bem escrito.
Olha só, eu já estou usando o JavaComm desde Novembro do ano passado e depois de muitas dificuldades para configurar tudo corretamente consegui usá-lo sem problemas, tanto em Linux como em PC, em ambiente de DESENVOLVIMENTO (JDK, NetBeans). Porém, mês passado terminei meu projeto e preciso agora levar a aplicação (web) para o ambiente de produção, ou seja, apenas o JRE (nada de IDEs ou JDK) e o servidor de aplicação Apache Tomcat. Não encontrei em canto algum da internet uma explicação sobre isso. Apenas uns posts em inglês de uns gringos que estão tendo exatamente o mesmo problema que eu mas as sugestões de solução deles não estão funcionando no meu caso. O lance é o seguinte: após fazer o deploy da aplicação apenas o arquivo comm.jar é incluído no arquivo WAR e ele fica dentro da pasta webapps do Tomcat. Como nem o javax.comm.properties nem o driver (no meu caso é Linux, então é o libLinuxSerial.so, que é a mesma coisa do Win32comm.dll) estão na máquina não funciona. O problema é que não sei onde colocar eles. Nas pastas lib, lib/ext e lib/i386 do JRE não funciona (ou então algum detalhe está fugindo).. você me pareceu entender da API JavaComm então por acaso sabe algo sobre como fazer isso??? Podemos trocar umas idéias? Meu email é danielsocabral@gmail.com. Desde já agradeço pela atenção.
Um abraço!
em 19 Jul 2007 as 5:17 pm 26.Rafael Quines disse …
Olá amigo..
Mto obrigado pelos elogios. Admito que atualmente não tenho escrito nada de posts, mas estarei voltando com certeza…
Sobre seu problema, nunca cheguei a tentar fazer funcionar em um ambiente WEB. o que eu tentaria fazer é, além de colocar os arquivos nos diretórios do JRE que vc já deve estar careca de fazer, colocaria a DLL (ou no seu caso, a SO) no diretório BIN do tomcat, pois será desse diretório que o java será chamado e executado por dentro do container. Sobre o properties e o comm.jar, acho que tb deveria colocar no /common/lib. Ah, o properties, caso não funcione, tente colocá-lo no LIB tb, pois ele procura no diretório de onde foi chamado o Java.. Desculpe não poder ajudar mto, mas teria que ser por tentativas e erros mesmo..
Abraços..
Flw
em 15 Aug 2007 as 5:42 am 27.Fabricio disse …
Rafael, estou tentando fazer um sistema em WEB usando JSP com JavaFaces para escrever algo na porta COM1. Porém não estou conseguindo.
Como vc comentou acima que se tiver problemas em fazer rodar vc ajudaria sem problema, preciso da ajuda..rs..
Se estiver ocupado não tem problema.
Bom, hoj eu tenho um arquivo .TXT e atraves do DOS eu rodo a linha de comando c:\copy etiqueta.txt com1.
Esse arquivo .TXT tem alguns comandos da impressora ZEBRA e interpreta e sai um modelo de etiqueta.
Bom, só quero fazer isso através do JSF.
Na minha página teria um botão como (Imprimir Etiqueta) e ele executa a escrita na porta.
Porém não estou conseguindo fazer funcionar. Ele da erro logo nas primeiras linhas.
Mas específico: CommPortIdentifier.getPortIdentifiers().
Se puder ajudar agradeço.
E fico no aguardo.
Abraço
em 15 Aug 2007 as 6:33 pm 28.Rafael Quines disse …
Amigo, sobre fazer com WEB, teria que dar um jeito de acessar a porta COM do cliente certo? Quando precisei, uma vez fazer isso, fiz um applet. Através do applet, é possível sim, acessar os recursos locais do cliente, como a porta serial, por exemplo. Tem todo um esquema para assinar o applet para este ter acesso à máquina do cliente.
Mas sobre seu problema, ql é o erro?? Colocou os arquivos nos lugares certos???
flw
em 23 Oct 2007 as 2:46 am 29.Rafael Quines » Conversor Serial => Infra-Vermelho disse …
[…] Para dificuldades na escrita da porta serial, sugiro meu outro post, que fala justamente da configuração do ambiente para possibilitar a escreta na serial, usando a API Comm da Sun, segue o link. […]
em 12 Nov 2007 as 3:53 pm 30.francisco e silva disse …
boa noite rafael.
eu nao sou tão experiente em java, mas no meu trampo estou tendo que desenvolver uma aplicação para comunicar com um microcontrolador, atraves da porta serial, já baixei aquela apostila do GUJ, e estou a lendo, é que pra mim é meio confuso, voce saberia me dizer como é que eu posso ver fisicamente aquela aplicação do GUJ funcionando?
Desculpe a minha ignorancia, mas tenho que admititr as minha limitações.
um abraço.
em 18 Dec 2007 as 10:56 am 31.Júnior disse …
Rafael segui o seu artigo, por sinal muito bom, porém estou com um problema na hora de executar, sou programador PHP e estou iniciando em JAVA, quando tendo rodar a classe que está no artigo do GUJ da o seguinte erro:
Caught java.lang.NullPointerException: name can’t be null while loading driver com.sun.comm.Win32Driver
Você sabe o que pode ser? Estou usando o JDK 1.6
Desde já muito obrigado!
em 18 Dec 2007 as 1:04 pm 32.Rafael Quines disse …
Amigo, vc precisa colocar a DLL, o properties e o JAR nos diretórios que eu especifiquei no artigo.. Em que linha exatamente dá isso?? Poderia mostras seu código?!?
Flw
em 17 Jan 2008 as 3:40 am 33.rosse disse …
Olá Rafael Quines, blog mt bom;)
Gostava que me podesses ajudar…
Tenho uma aplicação Java instalada no Win98. Que ao listar as portas não me aparecem todas as portas serie que existem disponiveis no pc. Esta aplicação funciona correctamente em XP.
alguma ideia?
em 17 Jan 2008 as 5:55 pm 34.Rafael Quines disse …
Olha, o problema, acho que está na parte de liberação do windows para aplicativos mexerem diretamente na porta. Dá uma pesquisada na UserPort…
T+
em 15 Feb 2008 as 11:47 am 35.Eduardo Pacheco disse …
Olá Rafael!
Dei uma olhada no site e em alguns posts e me interessei bastante por JAVA.Esse ano eu tenho que entregar um projeto de tcc pro técnico em Processamento de Dados, queria aprender mais sobre a linguagem e sua característica multi plataforma.Quero aprender sobre a integração da linguagem com componentes eletrônicos, e pretendo usar isso no projeto.Sabe de algum lugar onde posso fazer um estágio na área?Não precisa ser remunerado.. o objetivo é aprender mesmo.Por hora faço técnico e facul, o tempo que tenho livre eh fds e nas férias.Não sei se ajuda mais gosto bastante de C.. arrisco um poco em C# e Delphi, e esse ano to vendo Oracle,COBOL, VB.NET e tenho noções de eletrônica que aprendi no SENAI.
Agradeço a atenção!!!
Eduardo
em 16 Feb 2008 as 12:50 pm 36.Rafael Quines disse …
Kra, não falou de onde vc é. Mas vale a pena dar uma olhada no CIEE do seu estado. Sempre tem estágios nessa área.. Flwww
em 22 Feb 2008 as 7:27 pm 37.Eduardo Pacheco disse …
Ops.. eu sou de Osasco -sp (ZO de SP), eu ja tentei pelo CIEE, mas não encontro bons estágios e dificilmente é na area.Até agora nada de java.Acabei de sair de um estágio e eu mexia com comp. gráfica, meio nada a ve com o que eu quero.Mas agradeço a atenção!
VLww
em 27 Feb 2008 as 6:09 pm 38.Jaisson disse …
Rafael, seu artigo está muito simples de compreender, muito obrigado.
Gostaria de saber se poderia auxiliar, pois terei que criar um “sincronizador” de palms com o PC, de preferência a conexão será feita por uma porta USB.
É possível reconhecer?
Configurei conforme o artigo indica e utilize o seu código. Com isso as portas lpt1 e lpt2 são reconhecidas.
Valeu
Meu e-mail é jaissonrd@gmail.com. Se puderes me enviar algo pelo e-mail, agradeço muito.
em 27 Feb 2008 as 6:24 pm 39.Rafael Quines disse …
E ae… Kra, nunca tentei acessar a porta USB do micro, mas acredito que a API Java Comm não possibilite isso. Vou dar uma pesquisada assim q tiver um tempo, e te mando uma resposta mais decente blz… Valeu. Flw
em 03 Mar 2008 as 11:36 am 40.Ricardo Martina disse …
Rafael,
Estou bastante enpolgado, pois consegui fazer o netbeans mostrar (RING e um monte de 0000000000), Já é um bom sinal!!!
Você não tem como me ajudar a mostrar mesmo o que interessa, que é o número do telefone.
Grato pela atenção,
Ricardo Martins
em 03 Mar 2008 as 12:19 pm 41.Rafael Quines disse …
Amigo, o que está exatamente fazendo? Está comunicando com o modem? poderia me explicar o que pretende para assim saber se tenho como lhe ajudar? Flw
em 04 Mar 2008 as 10:30 am 42.Ricardo Martina disse …
Isso, estou tentando receber o número do telefone através do fax/modem, digito o comando ATZ (resetar) e o AT#CID=1 (para receber o Nº), depois só mostra RING e um monte de 0000000000 estes zeros parece quadrados (usando o netbeans). No hiper terminal funciona certinho ele mostra o número e depois os Rings. Estou utilizando o código que você disponibilizou para comunicação serial.
em 04 Mar 2008 as 11:06 am 43.Rafael Quines disse …
Kra, poderia me mandar o seu código para mim analizar? não esqueça q o modem gospe os dados em ASCII… flw
em 05 Mar 2008 as 5:39 am 44.felipe de assis pereira disse …
quero fazer minha inscrição para o curso é o 1° emprego
em 05 Mar 2008 as 6:31 am 45.Rafael Quines disse …
???
em 05 Mar 2008 as 11:01 am 46.Ricardo Martins disse …
Rafael não consegui mandar o código, pelo site, você tem e-mail. eu ja fiz de tudo e programa só reconhece
Ring
000000000000
Ring
00000000000
Me ajude por favor.
em 09 Mar 2008 as 6:18 am 47.Ricardo Martins disse …
Olhou o código!!!
será que tem algum erro!!!
em 09 Mar 2008 as 7:02 pm 48.Rafael Quines disse …
Kra, erro não tem. Mas como conversamos pelo e-mail, vc deve implementar o SerialPortEventListener ao inves de chamar o método para escutar… Assim, vc sempre fica escutando.
Flw
em 20 May 2008 as 11:00 am 49.carlos disse …
init:
deps-jar:
compile:
Exception in thread “main” java.lang.UnsatisfiedLinkError: no parport in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1698)
at java.lang.Runtime.loadLibrary0(Runtime.java:840)
at java.lang.System.loadLibrary(System.java:1066)
at parport.ParallelPort.(ParallelPort.java:71)
at sensor.Main.main(Main.java:6)
Java Result: 1
debug:
CONSTRUÍDO COM SUCESSO (tempo total: 5 segundos)
em 20 May 2008 as 11:07 am 50.carlos disse …
Por favor me ajude :
init:
deps-jar:
compile:
run:
Exception in thread “main” java.lang.UnsatisfiedLinkError: no parport in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1698)
at java.lang.Runtime.loadLibrary0(Runtime.java:840)
at java.lang.System.loadLibrary(System.java:1066)
at parport.ParallelPort.(ParallelPort.java:71)
at sensor.Main.main(Main.java:6)
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)
em 20 May 2008 as 11:15 am 51.carlos disse …
problema resolvido,, obrigado o software em java, ja ta rodando perfeito, agora vou ver a parte eletronica,, obrigado
em 20 May 2008 as 11:20 am 52.Rafael Quines disse …
Esses erros de UnsatisfiedLinkError acontece qnd a DLL não está no lugar que deveria…
flw
em 07 Jun 2008 as 4:32 pm 53.Bruno Nave disse …
Ola Rafael!
Podes me mandar po meu email esses 3ficheiros (javax.comm.properties, win32com.dll e a comm.jar)
é que não os encontro em lado nenhum :(
Muito Obrigado. Abraço
em 07 Jun 2008 as 4:33 pm 54.Bruno Nave disse …
Ola Rafael!
Podes me mandar po meu email esses 3ficheiros (javax.comm.properties, win32com.dll e a comm.jar)
é que não os encontro em lado nenhum :(
Muito Obrigado. Abraço
O meu email é: brunonave@gmail.com
em 07 Jun 2008 as 8:01 pm 55.Rafael Quines disse …
Amigo, já tinha disponibilizado o link no comentário nro 18. Segue o link: Baixe Aqui
flw
em 13 Jun 2008 as 9:50 am 56.Bruno Nave disse …
Ok Valeu! Muito Obrigado!
Posso usar qualquer versão JDK ou JRE?
Ou tenho que usar alguma me especifico!!
Tou a trabalhar em Windows XP, no JBUILDER 2006 Enterprise!!
em 13 Jun 2008 as 10:07 am 57.Bruno Nave disse …
É que tentei configurar mas ao correr o programa ta me dando o seguinte erro: :(
Error loading SolarisSerial: java.lang.UnsatisfiedLinkError: no SolarisSerialParallel in java.library.path
Caught java.lang.UnsatisfiedLinkError: readRegistrySerial while loading driver com.sun.comm.SolarisDriver
em 19 Jun 2008 as 1:49 pm 58.Francisco disse …
Rafael, boa noite.
A um tempo, eu postei aqui uma dúvida, mas confesso que estava sem noção nenhuma do assunto, hoje já um pouco mais sabido e já enviando dados para a porta serial, gostaria de saber como resolver um problema que estou tendo:
Eu preciso manter a porta em nível 0 por 25ms e em nivel 1 por mais 25ms respectivamente nesta ordem, e depois começar o envio de dados. Tentei fazer isso enviando ‘\u0000′ que mantem a linha em baixa, no entanto em nenhuma config de baudrate eu consigo os 25ms. Eu até conseguiria se eu pudesse setar o baud para o tempo que eu precisasse. Será que existe alguma forma de fazer isso?
Muito obrigado.
Francisco
em 19 Jun 2008 as 3:23 pm 59.Rafael Quines disse …
Kra, consigo entender exatamente sua necessidade. O grande problema aki é q estamos em cima de um sistema operacional. Qnd tu dá um sleep pelo JAVA pra esperar os 25ms, passa por várias camadas até chegar no processador. Tipo, nunca dará exatamente os 25ms q deseja. Mas me diz um negócio, ql dos pinos vc está querendo manter em nivel 0 ou 1???
em 19 Jun 2008 as 4:20 pm 60.Francisco disse …
Rafael.
Realmente, com o sleep, eu medi com um osciloscopio a saida, e percebi que sempre varia mesmo. O pino que preciso manter em 0 e 1 é o pino 3(transmitted data).
Obrigado, e , se tiver novidades me informe.
em 21 Jun 2008 as 7:09 pm 61.Rafael Quines disse …
Amigo, acho que o Windows não te dá essa possibilidade. Tipo, tu pode escrever um byte, q ele manda pela serial, mas não sei se tem como vc mesmo fazer os níveis 1 e 0.
Desculpe não poder ajudar..
T+
em 11 Jul 2008 as 5:02 pm 62.Fonseca disse …
Amigos, alguém sabe qual o comando que uso para enviar um pulso para a porta Serial (COM1, qualquer pino) em Visual Basic para o acionamento de dispositivos?
Fonseca
em 20 Jul 2008 as 1:37 pm 63.Rodrigo disse …
Rafael, estou trabalhando no meu TCC e estou com muita dificuldade em relação a ler da Serial com a JAVACOMM.
Basicamente meu projeto consiste na comunição SERIAL com uma placa que tem um microcontrolador que conversa com a injeção eletronica de automoveis que usam o padrão OBD-II e traduz isto para ASCII jogando pela serial.
A placa esta funcionado perfeitamente, qdo uso o Hyperterminal e digito por exemplo o comando de solicitação de RPM recebo os valores em ASCII.
Olhe o log do HyperTerminal Abaixo
>ATZ // manda reset para a placa
ELM323 v2.0 // resposta da placa com sua versão…
>010C // solicitação de leitura do RPM do motor
BUS INIT: …OK // na primeira comuniçao a placa inicializa a comunicação com a Injeção do Carro
41 0C 0D 50 // aqui esta a informação que depois de aplicar uma formula simples ira informar a rotação do motor
>010C // solicitação de RPM
41 0C 0D 4E // Resposta…
>010C
41 0C 0C E2
>010C
41 0C 0C E0
>010C
41 0C 0C D4
Estou usando como base o tutorial da JAVACOMM disponivel aqui no GUJ.
Meu problema esta no momento de RECEBER OS DADOS .. não consigo receber os dados completos, não tenho nenhuma intimidade com THREADS e estou desconfiado que o problema deve estar por ter multiplos pontos de execução.
Sera que vc poderia ajudar?
Muitissimo Obrigado
em 21 Jul 2008 as 10:50 am 64.Marcos disse …
Estou com um projeto da faculdade emandamente e estou usando um sensor desse de alarme pra fazer um esperimento, sou do curso de informatica e não manjo nada de eletronica, bem mais vamo lá. Encontrei um programa na internet que checa se a serial esta funcionando mesmo, nesse programa ele pede pra colocar em curto o pino 2 e 3 da serial e o sensor faze exatamente isso, quando esta sem ninguem na sua frente ele se encontra fechado e dá comunicação com sucesso, caso abre passe alguem na sua frente ele abre o sinal e então dá falha na cumunicação. Estou querendo usar essa logica pra imprementar em java um programa que faz isso, mas não estou conseguindo. Estou usando pra comunicar com a serial a API RXTX e ela esta funcionando blz ja testei com um leitor. Mas pra minha precisão não esta servindo, vi que vc Rafael entende bem disso, o que me diz consigo checar em JAVA se existe essa comunicação ou não? Estou aguardando.. Obrigado…
em 14 Aug 2008 as 11:47 am 65.Francisco disse …
>Rodrigo disse …
>um microcontrolador que conversa com a injeção >eletronica de automoveis que usam o padrão OBD-II e >traduz isto para ASCII jogando pela serial.
Rodrigo, estou tentando desenvolver um trabalho semelhante ao seu talvez.
To tendando descobrir, ainda sem sucesso, como configurar o baudrate para 10400, o qual é exigido pela norma ISO14230, parece que o java não permite isso, certo? tem que trabalhar com JNI!, existe uma outra forma de fazer isso? Estou usando a API RXTX, mas ainda usando os exemplos existentes na documentação, sem configurar a velocidade correta eu não posso fazer praticamente nada ainda. Poderia me dar uma dica?
Muito obrigado
em 16 Aug 2008 as 1:00 am 66.Oxycodone. disse …
Oxycodone….
I s percaset oxycodone. Buy oxycodone without prescription. How long does oxycodone stay is system. Oxycodone how long in system. Pictures of oxycodone 80 mg….
em 20 Sep 2008 as 9:01 am 67.Jonathas disse …
ola Rafael tudo bem estou desenvolvendo um software academico para um manipulador robótico com porta serial mas não consegui baixar api no site da sum parece que eles não fornecem mais .
tem como vc me envia-la
obrigado
jonathas
jonathasab@yahoo.com.br
em 20 Sep 2008 as 6:57 pm 68.Rafael Quines disse …
Bom kra, nem me lembro de onde baixei essa versão pra Windows. To disponibilizando no meu site. Baixe e use essa versão com a DLL e o properties.
BAIXE AQUI
Esse foi o comentário nro 18. Flw
em 24 Sep 2008 as 5:20 am 69.jonathas disse …
obrigado
se precisar de algo
valeu
em 02 Dec 2008 as 5:30 am 70.Fábio Rueda disse …
Olá Rafael,
Muito bom seu blog, parabens!
Estou com problemas para reconhecer as portas exsitentes.
Estou rodando o exemplo “SerialDemo” mas nao aparece nenhuma porta para escolher.
Fiz todo o procedimento de cópia dos arquivos para as respectivas pastas, mas nada.
Você pode me ajudar?
tem algum e-mail, MSN, sinal de fumaça para conversar melhor com vc a respeito?
Abraços.
em 02 Dec 2008 as 5:51 am 71.Rafael Quines disse …
Cara, dá alguma msg de erro?
em 21 Mar 2009 as 6:54 pm 72.beto baracho disse …
Poh, cara muito bom. eternamente grato.
em 22 Mar 2009 as 12:49 pm 73.Rafael Quines disse …
Blz. Estou a disposição p/ eventuais dúvidas…
Abraço
em 21 May 2009 as 6:45 pm 74.Eduardo Farias disse …
Cara me tira uma duvida!!!
Fiz um código baseado nos arquivos que encontrei na Net para enviar e ler dados pela serial utilizando a API RxTx. Consegui testar a escrita de dados utilizando o Virtual Serial Port, ou seja, criava um par de portas conectadas virtualmente e enviava dados de uma porta pra outra(NetBeans e Hiperterminal).O problema é que não estou conseguindo ler no NetBeans que eu escrevo no Hiperterminal, ai vai a pergunta: Para que eu possa efetuar a leitura eu tenho que ter um dispositivo conectado a porta serial ou estou com algum problema de código?
em 22 May 2009 as 7:57 pm 75.Rafael Quines disse …
Olá Eduardo. Teria que dar uma analisada no seu código. Mas normalmente o que faço é usar um adaptador USBxSerial,e ligar o TX no RX pra testar, assim, tudo o que eu escrevo, eu recebo tb. Mas a resposta é nao, vc nao precisa ter um dispositivo, com o Hyperterminal deveria funcionar, inclusive já fiz isso. Vc implementou o método serialEvent? como disse, teria que dar uma olhada no código..
abraço
em 23 May 2009 as 8:28 am 76.Eduardo Farias disse …
Cara eu não sou programador. Acho que o meu erro está no Main. O meu código escreve e depois tenta ler algum dado da serial. Vc poderia me dar alguma sujestão de código que fica esperando receber dados da serial? Consigo escrever numa boa, mas não to conseguindo testar a leitura.
package comunicaçãoserial2;
import java.*;
import SrComm.SComm;
import SrComm.SerialComm;
public class Main extends SerialComm {
public Main(){
super();
}
public static void main(String[] args){
Main st = new Main();
if ( st.PortaExiste(”COM4″) == true) {
System.out.println(”Iniciando comunicação!”);
SComm sc = new SComm(”COM4″,9600,2000);
sc.HabilitarEscrita();
sc.ObterIdDaPorta();
sc.AbrirPorta();
sc.EnviarUmaString(”Eu sou o Cara!”);
sc.FecharCom();
}
Main st2 = new Main();
if ( st2.PortaExiste(”COM4″) == true) {
System.out.println(”Iniciando comunicação!”);
SComm sc2 = new SComm(”COM4″,9600,2000);
sc2.HabilitarLeitura();
sc2.ObterIdDaPorta();
sc2.AbrirPorta();
sc2.LerDados();
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
System.out.println(”Erro na Thread: ” + ex);
}
sc2.FecharCom();
}
}
}
em 23 May 2009 as 8:29 am 77.Eduardo Farias disse …
Essas são as classes que usei:
package SrComm;
import java.*;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.*;
//classe Principal
public class SComm implements Runnable, SerialPortEventListener {
//propriedades
private String Porta;
public String Dadoslidos;
public int nodeBytes;
private int baudrate;
private int timeout;
private CommPortIdentifier cp;
private SerialPort porta;
private OutputStream saida;
private InputStream entrada;
private Thread threadLeitura;
protected String peso;
//indicadores
private boolean IDPortaOK; //true porta EXISTE
private boolean PortaOK;// true porta aberta
private boolean Leitura;
private boolean Escrita;
public void setPeso(String peso){
this.peso = peso;
}
public String getPeso(){
return peso;
}
//construtor default paridade : par
//baudrate: 9600 bps stopbits: 2 COM 1
public SComm() {
Porta = “COM1″;
baudrate = 9600;
timeout = 1000;
}
//um Objeto ComObj é passado ao construtor
//com detalhes de qual porta abrir
//e informações sobre configurações
public SComm(String p, int b, int t) {
this.Porta = p;
this.baudrate = b;
this.timeout = t;
}
//habilita escrita de dados
public void HabilitarEscrita() {
System.out.println(”Teste Habilita Escrita1″);
Escrita = true;
Leitura = false;
}
//habilita leitura de dados
public void HabilitarLeitura() {
System.out.println(”Teste Habilita Leitura2″);
Escrita = false;
Leitura = true;
}
//Obtém o ID da PORTA
public void ObterIdDaPorta() {
System.out.println(”Teste Obeter Porta3″);
try {
cp = CommPortIdentifier.getPortIdentifier(Porta);
if (cp == null) {
System.out.println(”Não existem portas disponíveis.”);
System.out.println(”ERRO!Abortando…”);
IDPortaOK = false;
System.exit(1);
}
IDPortaOK = true;
} catch (Exception e) {
System.out.println(”A porta ” + Porta + ” não existe” + e);
IDPortaOK = false;
System.exit(1);
}
}
//Abre a comunicação da porta
public void AbrirPorta() {
System.out.println(”Teste Abrir Porta 4″);
try {
porta = (SerialPort) cp.open(”SComm”, timeout);
PortaOK = true;
System.out.println(”Porta aberta com sucesso!”);
//configurar parâmetros
porta.setSerialPortParams(baudrate,
porta.DATABITS_8,
porta.STOPBITS_2,
porta.PARITY_NONE);
porta.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
} catch (Exception e) {
PortaOK = false;
System.out.println(”Erro ao abrir a porta! STATUS: ” + e);
System.exit(1);
}
}
//função que envie um bit para a porta serial
public void EnviarUmaString(String msg) {
System.out.println(”Teste Enviar String 5″);
if (Escrita == true) {
try {
saida = porta.getOutputStream();
System.out.println(”FLUXO OK!”);
} catch (Exception e) {
System.out.println(”Erro.STATUS: ” + e);
}
try {
System.out.println(”Enviando um byte para ” + Porta);
System.out.println(”Enviando : ” + msg);
saida.write(msg.getBytes());
Thread.sleep(100);
saida.flush();
} catch (Exception e) {
System.out.println(”Houve um erro durante o envio. “);
System.out.println(”STATUS: ” + e);
System.exit(1);
}
} else {
System.exit(1);
}
}
//leitura de dados na serial
public void LerDados() {
System.out.println(”Teste Ler dados 6″);
if (Escrita == false) {
try {
entrada = porta.getInputStream();
System.out.println(”FLUXO OK!”);
} catch (Exception e) {
System.out.println(”Erro.STATUS: ” + e);
System.exit(1);
}
try {
porta.addEventListener(this);
System.out.println(”SUCESSO. Porta aguardando…”);
} catch (Exception e) {
System.out.println(”Erro ao criar listener: “);
System.out.println(”STATUS: ” + e);
System.exit(1);
}
porta.notifyOnDataAvailable(true);
try {
threadLeitura = new Thread(this);
threadLeitura.start();
} catch (Exception e) {
System.out.println(”Erro ao iniciar leitura: ” + e);
}
}
}
//método RUN da thread de leitura
public void run() {
System.out.println(”Teste Run 7″);
try {
Thread.sleep(5000);
} catch (Exception e) {
System.out.println(”Erro. Status = ” + e);
}
}
public void serialEvent(SerialPortEvent ev){
System.out.println(”Teste Serial Event 8″);
StringBuffer bufferLeitura = new StringBuffer();
int novoDado = 0;
switch (ev.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
//Novo algoritmo de leitura.
while(novoDado != -1){
try{
novoDado = entrada.read();
if(novoDado == -1){
break;
}
if(’\r’ == (char)novoDado){
bufferLeitura.append(’\n’);
}else{
bufferLeitura.append((char)novoDado);
}
}catch(IOException ioe){
System.out.println(”Erro de leitura serial: ” + ioe);
}
}
setPeso(new String(bufferLeitura));
System.out.println(getPeso());
break;
}
}
//gerenciador de eventos de leitura na serial
// public void serialEvent(SerialPortEvent ev) {
// switch (ev.getEventType()) {
// case SerialPortEvent.BI:
// case SerialPortEvent.OE:
// case SerialPortEvent.FE:
// case SerialPortEvent.PE:
// case SerialPortEvent.CD:
// case SerialPortEvent.CTS:
// case SerialPortEvent.DSR:
// case SerialPortEvent.RI:
// case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
// break;
// case SerialPortEvent.DATA_AVAILABLE:
// byte[] bufferLeitura = new byte[20];
// try {
// while (entrada.available() > 0) {
// nodeBytes = entrada.read(bufferLeitura);
// }
// String Dadoslidos = new String(bufferLeitura);
// if (bufferLeitura.length == 0) {
// System.out.println(”Nada lido!”);
// } else if (bufferLeitura.length == 1) {
// System.out.println(”Apenas um byte foi lido!”);
// } else {
// System.out.println(Dadoslidos);
// }
// } catch (Exception e) {
// System.out.println(”Erro durante a leitura: ” + e);
// }
// System.out.println(”n.o de bytes lidos : ” + nodeBytes);
// break;
// }
// }
//função que fecha a conexão
public void FecharCom() {
System.out.println(”Teste Fechar Com 9″);
try {
porta.close();
System.out.println(”CONEXAO FECHADA>>FIM..”);
} catch (Exception e) {
System.out.println(”ERRO AO FECHAR. STATUS: ” + e);
System.exit(0);
}
}
//Acessores
public String obterPorta() {
return Porta;
}
public int obterBaudrate() {
return baudrate;
}
}
em 23 May 2009 as 8:30 am 78.Eduardo Farias disse …
package SrComm;
import java.*;
import gnu.io.CommPortIdentifier;
import java.util.*;
public class SerialComm {
//*********************************
//Variáveis
//*********************************
//variáveis para identificar portas
protected String[] portas;
protected Enumeration listaDePortas;
//construtor
public SerialComm(){
listaDePortas = CommPortIdentifier.getPortIdentifiers();
}
//retorna as portas disponíveis
public String[] ObterPortas(){
return portas;
}
//Copia portas para um Array
protected void ListarPortas(){
int i = 0;
portas = new String[10];
while (listaDePortas.hasMoreElements()) {
CommPortIdentifier ips =
(CommPortIdentifier)listaDePortas.nextElement();
portas[i] = ips.getName();
i++;
}
}
//pesquisa se a Porta existe
public boolean PortaExiste(String COMp){
String temp;
boolean e = false;
while (listaDePortas.hasMoreElements()) {
CommPortIdentifier ips =
(CommPortIdentifier)listaDePortas.nextElement();
temp = ips.getName();
if (temp.equals(COMp)== true) {
e = true;
}
}
return e;
}
//imprime as portas disponíveis
protected void ImprimePortas(){
for (int i = 0 ; i
em 23 May 2009 as 8:31 am 79.Eduardo Farias disse …
Continuando:
protected void ImprimePortas(){
for (int i = 0 ; i
em 23 May 2009 as 8:34 am 80.Eduardo Farias disse …
Ficarei muito grato se vc puder me ajudar.
Obrigado.
Eduardo Farias.
em 23 May 2009 as 10:34 am 81.Rafael Quines disse …
Olá Eduardo. É o seguinte, quando vc está aguardando alguma escrita na porta serial, nao precisa especificamente “aguardar”.. qnd vc chama onDataAvaiable e setListener, vc está configurando uma interrupção, que qnd vier algo na porta serial, automaticamente irá ser chamado esse metodo.
Bom, qnd aprendi a manipular a porta serial, segui o seguinte exemplo: http://www.guj.com.br/article.show.logic?id=148
Abraço