domingo, 14 de dezembro de 2008

Acesso à porta paralela no Java!


   1.  Acesso à porta paralela no  Java!

Em continuação ao artigo anterior, continuaremos a falar sobre o acesso à porta paralela no windows, só que ao contrário do que foi abordado anteriormente, explicitaremos maneiras de como operar dispositivos externos atravéz da porta paralela por meio da liguagem Java.

   Foram encontradas 3(três) formas para realizarmos este acesso, foram elas:

  • Parport;
  • JnpOut32;
  • Java Commapi.

Apesar de terem sido encontradas as 3 (três) formas de acesso, iremos falar apenas de 2(duas) delas: a parport e a jnpout32.

                A  Commapi do java foi colocada como curiosidade,  apenas para sabermos que existe, nada mais. Não iremos nos aprofundar nela, contudo está disposto na secção Links deste artigo, o endereço para que seja feito o download dos arquivos que a compôe, bem como um link para sua api.  

2. Os pacotes de acesso: Parport e JnpOut32

Como o Java é uma linguagem de alto nivel, logo a sua comunicação com harware se torna uma tarefa extremamente  prejudicada e sua implementação altamente complexa, esta é uma das razões de nossa relutânciare em explicar o funcionamento da  JavaCommapi.

Para que fosse possível a comunicação entre o codigo Java escrito com o hardware de comunicação paralela,  os autores do parport e do jnpout32,  utilizaram-se da interessante propriedade  JNI( Java Native Interface) do java.

O JNI permite que o código escrito em Java utilize funções desenvolvidas em outras linguagens, tornando possível, dessa forma, o acesso da linguagem Java ao hardware, por intermedio de uma serie de funções de ligação escritas e compiladas em linguagens de mais baixo nivel e que por consequinte tem o seu acesso ao hardware facilitado e melhor otimizado, nos casos estudados os autores utilizaram-se da linguagem C/C++ .

Vale ressaltar que, a utilização do JNI, apesar de fornecer o  acesso direto ao hardware por meio de funções nativas, o que nos possibilita o controle de dispositivos externos e outras aplicabilidades, faz com que o codigo Java perca um dos pilares de sua implementação, e uma de suas principais características como linguagem de vanguarda, que é a sua portabilidade.

A chamada de funções de outras linguagens, no codigo Java é possível utilizando os arquivos DLL, previamente criados contendo às funções que serão nescessárias para os acesso ao hardware, e carregando–o dentro do codigo Java a ser desenvolvido. Ambos os pacotes de acesso já vieram com essas chamadas inclusas nas bibliotecas anexas aos arquivos para download.  

  2.1. Parport

Para que o método, criado por, Juan Gabriel Del Cid Portillo funcione é necessário que se faça o download do pacote parport.

 

Após o download e descompactação do arquivo parport é preciso que sejam seguidas algumas etapas antes de realizarmos os primeiros teste.

Como o arquivo de acesso do parport está em formato DLL é impressindível que o parport.dll, que acompanha o pacote, seja colocado nos folders BIN da sua JDK e de seu JRE.

 Apenas adicionar o parport.dll aos folders correnpondentes não é bastante. Para tanto utilizaremos mais uma vez o Userport para realizarmos a liberação da porta paralela no SO Windows. O uso do Userport já foi discutido no post anteriorRealizada todas estas etapas é só criar o seu codigo conforme o set de instruções que vem acompanhando o pacote parport e exemplificados nos samples que o acompanham.

2.1.1.  Codigo para teste


/**

 * Título : AcessoParalelaJavaParport.java

 * Descrição : Codigo para teste de escrita da porta paralela - Artigo II

 * Copyright : Copyright(c) 2008

 * @return

 * @autor : Thomaz Prado

 * @Empresa: Engenharia Mecatrônica - FTC: Faculdade de Tecnologia e Ciências

 * 

 * @outros: mecatrons.blogspot.com

 * @versão: 0.9v

 */


package ArtigoII; //Controi package ArtigoII

import javax.swing.JOptionPane;

import parport.ParallelPort; //Importa as classes do package ParallelPort.


public class ArtigoParalelaJavaParport {


public static void main(String[] args) {

 int LPT1 = 0x378; //Define porta a ser usada

 int dadoEnviado =0; //Inicia o valor da variavel dadoEnviado

ParallelPort porta=new ParallelPort(LPT1); //Acessa registro de dados 0x378.

System.out.println("Iniciado!!");

while(dadoEnviado<64)>

porta.write(dadoEnviado); //Escreve o valor alocado em dadoEnvia na porta paralela

dadoEnviado++; //Incremeta valor de dado envia

try {

Thread.sleep(200); //Delay 200ms

System.out.println("Valor enviado = "+ dadoEnviado);

} catch (Exception e) { JOptionPane.showMessageDialog(null, e);}

}

porta.write(0); //Escreve valor 0 na porta paralela

System.out.println("Finalizado!!");

}// Fim do Main();

}// Fim da classe principal.  JaVa RoX ;)



2.1.1.1. Considerações sobre o Parport

Durante os testes relizados com o codigo proposto acima, bem com os teste realizados com os Samples presentes no package parport, foi notado uma inconsistência, na verdade uma intabilidade no uso do parport. Não era incomum durante a execução do codigo a geração do seguinte erro:

Como forma de suprir esta instabilidade, foi realizado diversos teste, inclusive em estações de trabalho diferentes, aliados a longas buscas por usuários que já haviam passado por esta estapa e que porventura já haveriam de superado-a. Para nossa surpresa o numero de usuários com o mesmo tipo de instabilidade era cada vez mais crescente a cada busca e cada vez menos soluções duradouras e viáveis eram propostas.

Foi neste horizonte pertubador que, felizmente, encontramos o método JnpOut32, criado pelo Douglas Beattie Jr., que se apresentou estável e com uma estrutura de programção mais clara e fácil de ser compreendida. O metodo está descrito no tópico abaixo.

2.2.    JnpOut32

Como o pacote JnpOut32, tambem é acessado por meio de uma arquivo DLL, jnpout32pkg.dll, faz-se nescessário que este também seja adicionado  em alguns folders externos, mas diferentemente do parport.dll, para que o jnpout32pkg.dll possa ser acessado basta que este seja adiconado ao Windows\System32.

Finalizando este procedimento o metodo JnpOut32 já está pronto para ser chamado no codigo Java. Basta declarar algumas funções dentro do codigo fonte a ser desenvolvido para finalizar a utilização.


2.2.1.   Codigo para teste


/**

 * Título : AcessoParalelaJavaJnpOut32.java

 * Descrição : Codigo para teste de escrita da porta paralela - Artigo II

  * Copyright : Copyright(c) 2008

 * @return

 * @autor : Thomaz Prado

 * @Empresa: Engenharia Mecatrônica - FTC: Faculdade de Tecnologia e Ciências

 * 

 * @outros: mecatrons.blogspot.com

 * @versão: 0.9v

 */


package ArtigoII;   // Constroi um package ArtigoII

import javax.swing.JOptionPane; 

import jnpout32.*; // Importa o package jnpout32, sistema nervoso do controle da paralela


public class AcessoParalelaJavaJnpOut32 {

 static short dadoEnvia; //Declara

  static short LPT1; //Variaveis

  static pPort lpt; // do sistema.


static void do_read()

{

     // Ler a porta paralela

dadoEnvia = (short) lpt.input(LPT1);


     // Envia algumas menssagens ao console

     System.out.println("Porta lida: " + Integer.toHexString(LPT1) +

                         " = " +  Integer.toHexString(dadoEnvia));

}


static void do_write()

{

      //Escreve na porta paralela

     lpt.output(LPT1,dadoEnvia);

}


public static void main(String[] args) {

lpt = new pPort();

 

System.out.println("Iniciado!!");    

  LPT1=0x378; //Declara qual endereço iremos usar nest caso x378

    dadoEnvia=0x0;      //Inicia a variavel dadoEnvia


  while(dadoEnvia<16){>

    do_write(); //Escreve na porta 0x378 e no valor atual de dadoEnvia

     //Neste caso estamos iniciando com 0    

    try {

   System.out.println("Valor enviado = "+ dadoEnvia);     

Thread.sleep(250); //Delay ms

    } catch (Exception e) { JOptionPane.showMessageDialog(null, e);} 

    dadoEnvia++;  //incrementa dadoEnvia

  }

       

    // Ler qual porta esta sendo uasada 

    do_read();

    dadoEnvia = 0x0;  // dadoEnvia novamente com atributo 0, finalizando.

    do_write();    // Ler 0 do dadoEnvia e escreve na porta

    

System.out.println("Finalizado!!");    

   } // Fim do main();


}// Fim classe principal. JaVa RoX  ;)



2.2.2. Considerações sobre o JnpOut32

Durante os testes realizados não foram observados quaisquer tipo de instabiliade durante a execução dos aplicativos desenvolvidos. O uso do Userport para a liberação da porta paralela neste caso  se mostrou facultativo, uma vez que, testados os mais diversos codigos desenvolvidos em várias estações de trabalho, não foi notada à necessidade de uso do userport, contudo ele não é indipenssável e já nos mostrou a sua importância incontáveis vezes.

3. Considerações Finais

·         Todos os códigos foram escritos em linguagem Java JDK 6.0

o   Compilados em Eclipse SDK e Jcreator LE

o   Windows XP SP2 

·         Próximos artigos propóstos 

o   Hardware de teste para a porta paralela


4. Links (concluir e revisar)


2 comentários:

Anônimo disse...

Voce pode disponibilizar o download do parport ? estou procurando faz tempo e nao acho =/


vlw

Bruno Cunha disse...

Parabéns pelo artigo!
A varios meses tento fazer o acesso a porta paralela pelo Java mais sem sucesso.
Não conseguia resolver aquele erro do parport, mas com o jnpout32 ficou redondinho.
Obrigado