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 anterior. Realizada 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)


sábado, 12 de julho de 2008

Como acessar a porta paralela do Pc, no sistema windows?! (C/C++)


1. Como acessar a porta paralela do Pc, no sistema windows?! (C/C++)

                Esta é uma grande incógnita para quase todos os estudantes que iniciam um cursos de engenharia nas areas de computação, elétrica, mecânica e demais cursos afins, bem como  entusiastas!  

            Com o objetivo de nortear uma resolução para esta questão básica, que surge quando se inicia o estudo para o controle de dipositivos externos via porta paralela, no sistema windows, tentei compilar neste artigos algumas soluções,  interessantes e viáveis.
            Primeiramente, vale ressaltar que, se formos buscar por toda a internet, existem muitas formas de acessar a porta paralela nos sistemas windows NT, 2000 e XP, mas foram apenas duas delas que realmente chamaram a atenção, sendo pela sua viábilidade, bem como suas carateristicas.  E elas são:

1.    Inpout32¹;

2.    Userport¹.

¹. Todos os links para download encontram-se no tópico 5 (Links).

2. Inpout32.dll

A  inpout32 é uma dll criada para ser usada no acesso a porta paralela.

A DLL(Dynamic-link library) é, segundo a wikipedia: uma implementação feita pela Microsoft para o conceito de bibliotecas compartilhadas nos sistemas operacionais Microsoft Windows e OS/2.   Essas bibliotecas geralmente tem as extensões DLL, OCX (para bibliotecas que contêm controles ActiveX), ou DRV (para drivers de sistema legacy). 

A inpout32, tem a função de permitir o acesso de seu futuro aplicativo à porta paralela. Para tanto é necessário que o inpout32.dll esteja no mesmo diretório que se encontra o código fonte e tambem no diretório do executável:

Estando a inpout32 nos diretórios corretos, realizaremos as alterações no código fonte. Nele deverão estar incluídas, obrigatóriamente, as seguintes bibliotecas:

·       windows.h // stdlib.h // stdio.h // conio.h:

Uma vez declaradas as bibliotecas necessárias, é chegada a hora de criarmos o código fonte de teste para a comunicação a inpout32. Para tal, colocaremos o seguinte trecho*:

 typedef short _stdcall (*inpfuncPtr)(short portaddr);

typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);

 

*sempre antes do main(): 

e logo depois, já dentro da main() deve-se declarar as seguintes instâncias para a utilização da inpout32:


HINSTANCE hLib; //Instância para a DLL inpout32.dll.

inpfuncPtr inportb; //Instância para a função Imp32().

oupfuncPtr outportb; //Instância para a função Out32().

 /*------------------------------------------------------------------------------*/ 

hLib = LoadLibrary("inpout32.dll"); //Carrega a DLL na memória

if (hLib == NULL) { //Verifica se houve erro.

   printf("LoadLibrary Failed.\n");

   return -1;

}

 /*------------------------------------------------------------------------------*/ 

inportb=(inpfuncPtr) GetProcAddress(hLib, "Inp32");

if (inportb == NULL) {

    printf("GetProcAddress for Inp32 Failed.\n");

    return -1;

}

outportb= (oupfuncPtr) GetProcAddress(hLib, "Out32");

if (outportb == NULL) {

    printf("GetProcAddress for Oup32 Failed.\n");

    return -1;

}

Uma vez realizados, corretamente, todos os passos anteriores, é só usar as funções inport(PORTA) e outport(PORTA,DADOS) no codigo fonte.

É muito importante que ao final de seu código fonte a memória alocada durante a execução de seu aplicativo seja liberada, para isso, usa-se a função FreeLibrary(hLib).

Lembrete: A DLL deve ser distribuída juntamente com o executável e colocada no mesmo diretório de seu aplicativo. 

3.UserPort

Diferentemente do método que foi apresentado no tópico anterior, o UserPort é um programa executavel (.exe) que habilita o uso das portas. O userport foi criado por: Tomas Franzon.

Na imagem abaixo temos uma visão geral dos arquivos que compõem o diretório UserPort 

3.1 Visão Geral


3.2 Localização do .SYS

            Para que este método funcione o arquivo UserPort.sys deve ser colocado no seguinte diretório:  ..\\WINDOWS\system32\drivers.  A figura abaixo dá uma ideia melhor sobre a sua localização:


3.2   Visão executável

Feito a etapa anterior, basta configurar as portas e “startar” o UserPort.


        Bastando apartir de agora apenas a declaração dos métodos nativos da liguagem para o acesso à porta paralela.

4. Considerações finais

·         Todo o codigo foi desenvolvido em linguagem C.

o    Compilado em Dev C++ IDE;

o    Windows XP SP2.

·         O hardware de teste será mostrado em breve(eu espero...), em futuro artigo.

·         Proximos artigos propostos:

o    Metodo para controle da porta paralela em liguagem Java;

o    Hardware de teste para porta paralela.

5. Links:

Inpout32                                                      UserPort

Código-Fonte para teste                        

Todos os arquivos

Este artigo em PDF