Comunicar com portas

E ai galera do GUJ++

To tentando comunicar com uma porta serial(1ª vez que to fazendo isso), mas ta dificil, to seguindo esses links aqui em baixo e mais alguns, e um tutorial aqui do guj:

http://java.sun.com/developer/JDCTechTips/2002/tt0122.html
http://java.sun.com/developer/releases/javacomm/SimpleRead.java

Duvidas:

1 - No site e no tutorial diz que eu preciso copiar esses arquivos - comm.jar, win32com.dll e javax.comm.properties - para o diretorio jsdk/bin. Minha duvida eh onde estão os arquivos win32com.dll e javax.comm.properties que eu não estou encontrando, nem no windows nem nos arquivos que baixei da sun.

2 - Se eu usar essa biblioteca para comunicar com porta serial eu estou perdendo a portabilidade, pq estou utilizando arquivos do sistema operacional. Entao se eu precisar rodar a aplicação no linux, vou ter que configurar diferente, certo?

3 - Se eu for colocar a aplicação na maquina de algum cliente eu sempre terei que jogar os mesmos arquivos no diretorio bin para fazer funcionar. Se precisar rodar a aplicação em varias maquinas isso iria se tornar um pouco trabalhso, tem alguma outra saida para isso?

4 - Existe alguma outra biblioteca para comunicar com portas além da que a sun disponibiliza?

estou trabalhando com win xp e java 5.

Espero que alguem possa me ajudar

[quote=marcosbrandao]
1 - No site e no tutorial diz que eu preciso copiar esses arquivos - comm.jar, win32com.dll e javax.comm.properties - para o diretorio jsdk/bin. Minha duvida eh onde estão os arquivos win32com.dll e javax.comm.properties que eu não estou encontrando, nem no windows nem nos arquivos que baixei da sun.[/quote]

Não está achando? Você descompactou o zip da commapi? Esses arquivos deveriam estar dentro do diretório commapi, criado pelo próprio zip.

Existe uma versão da commapi para Linux. Mas é verdade, estará perdendo parte da portabilidade, já que a commapi não existe em todas as versões de Java onde temos uma VM.

No caso da dll, pode ser em qualquer diretório que esteja no path. O problema maior está no arquivo .properties, que tem que estar no diretório dentro das pastas do java. A única maneira de resolver isso é fazendo um instalador. Realmente, é um pepino.

Existe sim. A maioria visa te garantir acesso mais direto a serial, como acessar pino-a-pino, já que a da Sun é deficiente nesse aspecto. Dê uma olhada na biblioteca rxtx, ou na inpout32.

Mas não se engane. Como o acesso serial é feito por JNI, uma ou mais dlls sempre terão que ser adicionadas. A vantagem é que nem todas exigem o inconveniente arquivo .properties.

Eu já imaginava que seria vc que me responderia essa pergunta… :slight_smile:

De duas uma: ou esses arquivos realmente nao estão no zip ou eu estou ficando cego e completamente maluco…
No zip, soh vem o arquivo jar e 2 arquivos txt. Eu abrir o jar, e lah dentro tbm nao tem nada.

Deixa eu ver se entendi direito: Se eu colocar esse dll no diretorio c:\windows\system32 (que esta no path), não vai ter problemas. É isso?

Vou dar uma olhada nestas tbm, talvez me adapte melhor a elas…

Valeu ViniGodoy…

Agora eu vi uma coisa que me deixou na duvida:
Baixei o comm.jar para genric platform, e nesse arquivo eh o q nao tem nada.
Então baixei o arquivo para solaris x86, e nesse arquivo zip tem o properties, e dentro desse zip tem um arquivo explicano a utilização no windows.

Soh nao tem o arquivo win32com.dll lah.

Será q tem alguma coisa errada?

Cara vamos por partes para as suas perguntas:

  • A Commapi só existe na versão 2.0 para Windows, a partir daí só para Linux, por isso eu prefiro utilizar a RXTX que é igualmente portada e mantida tanto para Windows, como para Linux e Mac.

  • Quanto a portabilidade eu acho que não vai perder, pois vc compila seu código, e se o cara usar o Linux vc joga no path dele um arquivo SO, se for Windows joga um DLL. O seu código compilado é o mesmo, funciona sem problema.

  • Quanto a instalação em massa vc pode fazer um script ou um bash para resolver isso e botar para rodar nas estações. Ou uma solução mais refinada é dar uma busca no GUJ sobre geradores de instalação, aí vc gera um instalador e configura ele para fazer tudo.

  • Outra ponto, no GUJ tem um tutorial sobre comunicação serial muito bom, meu código é baseado nele, contudo por um pequeno detalhe de quem montou ele, a parte do código que trata o recebimento do imputstream da porta serial quebra as strings de forma incorreta acarretando lixo no seu código. Eu fiz uma alteração que pelo menos nos equipamentos que testei está funcionando bem melhor.
    Mas esse tutorial é muito bom mesmo, vale a pena ver e estuda-lo.

Realmente, parece que a Sun silenciosamente abandonou o suporte para Windows da javax.comm. Mas ela ainda pode ser baixada de alguns sites, como esse aqui:
http://wind.lcs.mit.edu/download/

Eu discordo do Petter no quesito portabilidade. Se é um código com dependências nativas, e não é garantido pela Sun, não é 100% portável.
Você terá que ter um instalação diferente em cada SO que quiser usar. E isso foge ao conceito do java de “write once, run everywhere”.

Bibliotecas prontas atenuam isso, mas é porque alguém já fez o trabalho de escrever varias vezes para você.

O ideal mesmo seria isso ser especificado na VM. Assim, você teria a certeza absoluta de que, em todo lugar que existe uma VM, se tiver portas seriais, você poderia controla-las.

Eu também achei o tutorial do GUJ legal. Embora eu tenha mais sucesso usando o OutputStream da serial diretamente, ao invés de usar o mecanismo de eventos.

Quanto a suas dúvida. Sim, se você jogar no windows\system32 deverá continuar funcionando. Aqui criamos um .bat que colocar o próprio diretório .\dll da aplicação no Path e deixamos por lá essas dlls. A gente usa tanto a javax.comm quanto a inpout. Não tenho experiência na RXTX, mas pelo que o petter falou, fiquei bem empolgado em conhece-la.