Adaptado e implentado por: Eng. Catalunha
site: http://www.catalunha.eng.br.
email: catalunha@catalunha.eng.br

Indice

Introdução
Endereços da Porta Paralela

Registradores
O conector DB25
Lista dos componentes utilizados para desenvolver os circuitos
Classes e funções em C/C++, para implementar seus programas
Acessando a Impressora através da BIOS
Ligando e desligando aparelhos externos através da Porta Paralela
Recebendo sinais externos através da Porta Paralela
Comunicação entre dois computadores usando a Porta Paralela


INTRODUÇÃO

       A porta paralela é uma interface de comunicação entre o computador e um periférico. Quando a IBM criou seu primeiro PC (Personal Computer) ou Computador Pessoal, a idéia era conectar a essa Porta uma impressora, mas atualmente, são vários os periféricos que utilizam-se desta Porta para enviar e receber dados para o computador (exemplos: Scanners, Câmeras de vídeo, Unidade de disco removível e outros).
       Se você conhece um pouco de eletrônica e domina uma linguagem de programação como: C/C++/C++Builder, Pascal/Delph ou mesmo o Visual Basic, poderá desenvolver um programa que controle um aparelho conectado à Porta paralela, ou um programa de transferência de arquivos entre dois computadores, utilizando um cabo paralelo como meio de transmissão. O seu conhecimento de eletrônica servirá para você desenvolver sua própria placa eletônica, que será conectada ao DB25 da porta paralela.
       Está página lhe fornecerá conhecimentos sobre a porta paralela, que o fará compreender e utilizá-la, de uma maneira não convencional, isto é, não somente para ser utilizada com uma impressora, mas também como qualquer outro aparelho, que o usuário tenha conhecimento sobre seu funcionamento, desejando controlá-lo através de seu Personal Computer, como diz a IBM.

Atenção!
       A Porta Paralela está ligada diretamente à placa mãe de seu computador. Muito cuidado ao conectar circuitos eletrônicos a essa porta, pois, uma descarga elétrica ou um componente com a polaridade invertida, poderá causar danos irreparáveis ao seu computador, seja coerente.

Boa pesquisa...

Não me responsabilizo por nenhum dano causado.



ENDEREÇOS DA PORTA PARALELA

       O seu computador nomeia as Portas Paralelas, chamando-as de LPT1, LPT2, LPT3 etc, mas, a Porta física padrão de seu computador é a LPT1, e seus endereços são: 378h ( para enviar um byte de dados pela Porta), 379h (para receber um valor através da Porta) e, 37Ah (para enviar dados). Às vezes pode está disponível a LPT2, e seus endereços são: 278h, 279h e 27Ah, com as mesmas funções dos endereços da porta LPT1 respectivamente.



REGISTRADORES

       Utilizando a Porta Paralela conectada a uma impressora, os endereços terão nomes sugestivos, como segue abaixo:

Nome
Endereços LPT1
Descrição
Registro de Dados
378h
Envia um byte para a impressora
Registro de Status
379h
Ler o Status da impressora
Registro de Controle
37Ah
Envia dados de controle para a impressora


 

O CONECTOR DB25

       O DB25 é um conector que fica na parte de trás do gabinete do computador, e é através deste, que o cabo paralelo se conecta ao computador para poder enviar e receber dados.
       A figura abaixo mostra o conector padrão DB25, com 25 pinos, onde cada pino tem um nome que o identifica:

Significado de cada pino do DB25

 

Esboço de funcionamento do DB25


LISTA DOS COMPONENTES UTILIZADOS PARA DESENVOLVER OS CIRCUITOS

      Para desenvolver os circuitos, você precisará adquirir os componentes eletônicos, e poderá encontrar em lojas que vendam materias de eletrônica, componentes como: cabo Paralelo, resistores, transístores, diodos, LEDs etc.


Lista dos componentes utilizados para desenvolver os circuitos:

Descrição
Componentes
Cabo Paralelo
(o mesmo utilizado pela impressora)
LEDs
Resistores
Diodos
Capacitores
Circuitos Integrados
Transístores
Relê
Fios para a interligação dos componentes
Ferro de soldar componentes, fonte de alimentação de 0 a 12v, solda, multímetro etc.


CLASSES E FUNÇÕES EM C/C++, PARA IMPLEMENTAR SEUS PROGRAMAS

       Utilize a classe em C++ abaixo, caso queira desenvolver programas para serem executados nos Sistemas Operacionais Windows 95 ou Windows 98.

Listagem da classe TPorta para ser usada no ambiente Windows 95/98

//Classe TPorta com seus métodos: Envia e Recebe
//Objetivo: Enviar e receber bytes através da Porta Paralela
//Copyright(c) 1999, Antonio Rogério
//Todos os Direitos Reservados

class
TPorta {
private: public: void Envia(unsigned int iEndPorta,unsigned char iByte);
unsigned char Recebe(unsigned int iEndPorta);
};

//-----------------------------------------------------------------
//Envia um byte para a Porta Paralela
void
TPorta::Envia(unsigned int iEndPorta,unsigned char iByte) { _DX = iEndPorta; _AL = iByte; __emit__ (0xEE);//Instrução da CPU }
//----------------------------------------------------------------- //Recebe um byte pela Porta Paralela
unsigned char
TPorta::Recebe(unsigned int iEndPorta) { _DX = iEndPorta; __emit__ (0xEC); //Instrução da CPU return(_AL); //Retorna um byte }

       Já para desenvolver programas no Sistema Operacional MS-DOS, utilize as funções descritas abaixo, encontradas nos compiladores da Borland com: Turbo C e o Borland C++.

Funções para serem usadas no MS-DOS:

Funções dos compiladores Turbo C ou C++Borland(R)
--------------------------------------------------------------------------------
Ler um byte de uma Porta do computador:
unsigned char inportb(int portid);
Onde: portid é o endereço da porta que se quer receber um byte.
Retorno: O byte lido da porta é capturado assim:
unsigned char RetByte = inportb(número_da_porta_que_se_quer_ler);
--------------------------------------------------------------------------------
Envia um byte para uma Porta do computador:
void outportb(int portid, unsigned char value);
Onde: portid é o endereço da porta que se quer enviar um byte.
           value é um byte a ser enviado para a porta.     




ACESSANDO A IMPRESSORA ATRAVÉS DO BIOS

       Você pode acessar a impressora através da interrupção de número 17h, fornecida pelo BIOS (Basic Input Output System), ou Sistema Básico de Entrada e Saída, que executa as funções elementares de funcionamento de seu computador.
       O BIOS fornece três serviços através desta interrupção: o serviço 00, que tem como objetivo enviar um byte à impressora; 01, inicializa a impressora, limpando seu buffer e o 02, retorna ao computador o Status da impressora (um byte codificado em bits), informando seu estado atual, ou seja, se tem papel ou não na bandeja, se está pronta para receber dados do computador e outras informações de controle.

Veja abaixo, os conectores que são ligados aos extremos do cabo paralelo:

DB36 - conectado a impressora
DB25 - conectado ao computador

Software:
       O exemplo abaixo mostra duas funções escritas em linguagem C++, utilizando o BIOS para interagir com uma impressora. A primeira função tem o objetivo de enviar um byte à impressora, e a outra, de ler seu status.

//Funções: PrintValor() e StatusPrint()
//Objetivo: Acessar a impressora através do BIOS
//Copyright(c) 1999, Antonio Rogério
//Todos os Direitos Reservados

//---------------------------------------------------------------
//Envia um byte para a impressora
void PrintValor(unsigned char Valor);
{

union REGS regs;
regs.h.ah = 0; //Servico de impressão
regs.h.al = Valor;
regs.x.dx = 0; //0 é a porta LPT1, 1,a LPT2
int86(0x17,&regs,&regs); //Interrupção da impressora
}
//Ler o status da impressora unsigned char StatusPrint(void)
{
union REGS regs;
regs.h.ah = 2; //Serviço 2 ler o status regs.x.dx = 0; //0 é a porta LPT1
int86(0x17,&regs,&regs);//Interrupção da impressora
return( regs.h.ah ); //Retorna um byte de status }



LIGANDO E DESLIGANDO APARELHOS EXTERNOS ATRAVÉS DA PORTA PARALELA

       Como já comentado, a Porta Paralela não é usada somente com uma impressora, você pode desenvolver um circuito eletrônico e acoplá-lo a essa porta e, através de um programa específico, enviar-lhe sinais digitais para controlá-lo.
 
      Abaixo temos três circuitos: o circuito-1, o circuito-2 e o circuito-3 que podem ser acoplados à Porta Paralela através de um cabo Paralelo e, controlados por um programa.


CIRCUITO-1

        A princípio o objetivo do circuito-1 é de ligar e desligar oito LEDs, conectados através de uma cabo à Porta Paralela.
       No esboço abaixo, observe que o terminal do catodo (K) dos LEDs estão ligados aos terminais dos resistores, que estes por si, estão ligados através do cabo aos pinos do DB25. Se invertidos, o circuito não funcionará. Observe a enumeração da pinagem do conector DB25.


Circuito-1

        Lista de componentes:
        1 (um) Cabo Paralelo - o mesmo utilizado pela impressora;
        8 (oito) Resistores (R1 a R8) todos de 470 ohm (amarelo, violeta e marrom);
        8 (oito) LEDs (L1 a L8) comuns de qualquer cor.

        Geral: fios, fero de soldar, solda etc.

Software:
       O programa abaixo pode ser compilado e executado para acender e apagar os LEDs do circuito-1.

//Envia sinal para a Porta Paralela LPT1:
#include <stdio.h>
#include <dos.h>
#define LPT1 0x378
int main(void)
{
   
unsigned char Valor=128; //Em binário: 10000000
    while( Valor > 0 )
   {   
              outportb(LPT1, Valor); // Envia para a Porta LPT1
             
 printf("\nPressione uma tecla para ascender o próximo LED...");
              getch( );

           
   Valor = Valor >> 1; //A cada passagem, o bit 1 é movido para a direita
    }
}


       Este programa, envia à Porta Paralela oito bytes, um a cada vez que o usuário pressionar uma tecla. A sequência de bytes geradas é vista na tabela abaixo:

Decimal
Binário
Pino/Fio ativo (5V)
Comentário
128
10000000
2 - D0
Cada bit do byte enviado à Porta Paralela está relacionado com um pino do DB5, e um fio do cabo paralelo, fisicamente. Ao enviar um byte, que o(s) bit(s) esteja(m) ligado(s) ou desligado(s), os LEDs acende(rão) ou apaga(rão) conforme os estados dos bits.
64
01000000
3 - D1
32
00100000
4 - D2
16
00010000
5 - D3
8
00001000
6 - D4
4
00000100
7 - D5
2
00000010
8 - D6
1
00000001
9 - D7

CIRCUITO-2

       Com o circuito-2, você pode controlar através da Porta Paralela mais quatro aparelhos eletro/eletrônico, enviando sinais para o registrador 37Ah. Ao enviar um byte para este registrador, mantenha os 4 últimos bits (nibble alto) zerados, para não interferir no registrador 378h.
       Quando for trabalhar com o registrador 37Ah, tenha sempre em mente que para ativar os sinais Slct In, AutoFeed e Strob, será necessário colocar os bits em 0 (zero), porque eles trabalham de forma invetida, 0 (zero) ativa, 1 (um) desativa. Somente o Init trabalha na sua forma normal.

Tabela descritiva dos sinais
Descrição/número dos pinos:

nenhum pino relacionado

Slctln
17
Init
16
AutoFeed
14
Strob
1
Posição dos bits: 7 6 5 4
3
2
1
2
Byte em binário:
 0 
 0 
 0 
 0
1
1
1
1
Byte em Decimal: 15

 

Circuito-2

        Lista de componentes:
        1 (um) Cabo Paralelo - o mesmo utilizado pela impressora;
        4 (quatro) Resistores (R1 a R4) todos de 470 ohm (amarelo, violeta e marrom);
        4 (quatro) LEDs (L1 a L4) comuns de qualquer cor.
        
Geral: fios, fero de soldar, solda etc.  

Software:
       O programa abaixo testa o circuito-2. O seu funcionamento é simples. Ao executá-lo, em primeiro lugar será enviado um byte à Porta Paralela que ligará todos os LEDs. Em seguida você pressionará uma tecla para enviar mais outro byte, agora este ligará somente o LED 1 e assim sucessivamente, até seja enviado o último byte, que apagará todos os LEDs.

//Envia para a Porta Paralela LPT1 no registro 37Ah:
#include <stdio.h>
#include <dos.h>
#define BIT0LIGALED1    3    // 0000 1010
#define BIT1LIGALED2  15    // 0000 1001
#define BIT2LIGALED3    9    // 0000 1111
#define BIT3LIGALED4  10    // 0000 0011
#define LIGATODOS            4   // 0000 0100
#define DESLIGATODOS   11   // 0000 1011
int main(void)
{
    outportb(0x37A,LIGATODOS);  //Liga todos os LEDs
    getch();
  
  outportb(0x37A,BIT0LIGALED1); //Liga LED 1
    getch();
    outportb(0x37A,BIT1LIGALED2);
    getch();
    outportb(0x37A,BIT2LIGALED3);
    getch();
    outportb(0x37A,BIT3LIGALED4);
    getch();
    outportb(0x37A,DESLIGATODOS);    //Desliga todos os LEDs
}

 

CIRCUITO-3

       A princípio, o objetivo do circuito-3, é de ligar e desligar aparelhos eletro/eletrônicos como: motores, portas e portões elétricos, fechaduras elétricas, rádios, televisões, etc. Mas você pode muito bem através de um programa de computador controlar braços de robôs, temporizadores, controles automáticos e muito mais.


Circuito-3

       No circuito acima, o chip 74LS541 é usado para proteger a Porta Paralela de altas correntes. Ele é alimentado com 5v, diferente da outra parte do circuito que controla o relê, que precisa de 12v para ser acionado. Os contatos do relê devem suportar 220v/10A, para que você possa acionar aparelhos de potência.
       Neste circuito você pode controlar até oito aparelhos simultaneamente, a partir das saídas S1 a S8. 
       Se você desejar controlar mais que um aparelho, adicione mais circuitos, idênticos ao da saída S1, às demais saídas (S2 a S8).

Atenção!
       O circuito acima trabalha ligado a Rede elétrica 110/220v. Tome muito cuidado ao conectar os componentes, um fio ligado na posição errada é fatal, tanto para você como para seu computador. Seja coerente, se você não conhece o suficiente de eletro/eletrônica, solicite a ajuda de um profissional.

        Lista de componentes:
        
1 (um) Cabo Paralelo - o mesmo utilizado pela impressora;
        1 (um) LED verde;
        1 (um) diodo 1N4148;
        1 (um) Resistor R1: 2,2K ohm (vermelho, vermelho e vermelho);
        1 (um) Resistor R2: 470 ohm (amarelo, violeta e marrom);
        1 (um) Transístor BD 137;
        1 (um) Circuito integrado 74LS541 (buffer);
        1 (um) Relê 12 volts na bobina - cargas até 220v/10A
        1 (uma) fonte de alimentação estabilizada de 5 a 12volts;
        Geral: fios, fero de soldar, solda etc.


RECEBENDO SINAIS EXTERNOS ATRAVÉS DA PORTA PARALELA

       A Porta Paralela, no modo padrão, têm cinco entradas. Isso é útil quando você precisa capturar sinais do mundo externo para dentro do computador. Como por exemplo, saber se um sensor esta ativo ou não; se um alarme foi disparado, etc.
        As cinco entradas através do conector DB25 são: Ack no pino 10, Busy no pino 11, Paper end no pino 12, Slct out no pino 13 e Error no pino 15. Portanto você poderá enviar para o computador cinco bits de uma só vez.
       Usando as funções inportb() ou Recebe() da classe TPorta, já comentadas nesta página, você poderá ler o registrador de Status da Porta Paralela, e saber se o sinal em um determinado pino está alto ou baixo (0-zero ou 1-um) no sistema binário.
       As funções inportb() e Recebe() lêem um byte através da Porta Paralela. Se você quiser saber se um determinado pino está com o sinal alto ou baixo, terá de converter este byte em binário para saber o estado do mesmo.
       Nem todos os bits do byte recebido através das funções inportb() ou Recebe() são válidos, como eu já mencionei, são somente cinco as entradas no registrador de Status da Porta Paralela, e cada entrada está relacionada com um bit.
       Ao ler o registrador de Status, os bits nas posições 0, 1 e 2 não devem ser levados em conta, porque não estão relacionados com nenhum pino do DB25, mesmo assim fará parte do byte recebido.
       A tabela abaixo mostra o significado de cada bit do byte recebido, através das funções inportb( ) ou Recebe( ), usando o Circuito 4 conectado à Porta Paralela. Observe que os bits, Ack, Paper end, Slct out e Error, trabalham de maneira invertida, diferente de Busy, que só é ativado quando tiver um sinal no pino 11:

Descrição/número dos pinos:
11
10
12
13
15
Nenhum pino relacionado nestas posições do byte
Byte lido em binário:
0
1
1
1
1
1
1
0
Byte lido em Decimal: 126


       Para saber como o computador agrupa os bits num byte, observe o esquema abaixo:

BYTE

       No esquema acima observe que cada nibble equivale a 4 bits; e a contagem dos bits é feita da direita para a esquerda (0,1,2,3...).

CIRCUITO-4

       Com o circuito-4 conectado à Porta Paralela você poderá enviar sinais para dentro de seu computador através das entradas E1 a E 5.
       Para enviar um bit através da entrada E1, ligue-a direto ao negativo da fonte de alimentação (0v), ou instale um interruptor para ficar mais prático.
       Como o circuito abaixo utiliza um Circuito Integrado buffer, que tem o poder de amplificar o sinal recebido, você poderá extender os cabos conectados as entradas (E1 a E5) a mais ou menos 20m de distânia. Faça testes.


Circuito-4

Atenção!
       Para enviar dados para dentro de seu computador através do circuito acima, use as entradas E1 a E5, com tensão elétrica negativa (0V) da fonte de alimentação em uso.
       Para enviar um bit com valor (1), ligue a respectiva entrada ao negativo.     
       Para enviar um bit com valor (0), desligue a respectiva entrada do negativo.

        Lista de componentes:
        
1 (um) Cabo Paralelo - o mesmo utilizado pela impressora;
        5 (cinco) Capacitores cerâmicos de (C1 a C5) todos de 103 pF;
        1 (um) Circuito Integrado 74LS541 (buffer);
        1 (uma) fonte de alimentação estabilizada de 5 volts;
        Geral: fios, fero de soldar, solda etc.
        

Software:
       O programa abaixo, lê a Porta Paralela LPT1 ininterruptamente enquanto nenhuma tecla seja pressionada, e exibe na tela do computador, o valor recebido em decimal.

//Ler Porta Paralela LPT1:
#include <stdio.h>
#include <dos.h>
int main(void)
{
   
unsigned char RetByte; //Para armazenar o valor recebido da Porta Paralela
    while( ! kbhit( ) )    // Faz enquanto nenhuma tecla for pressionada
    {
          RetByte = inportb(0x379); // Ler um byte da Porta Paralela (0x379)LPT1
           
   printf("%u\n",RetByte);
     }
}

 

Software:
       O programa abaixo, foi escrito para o Sistema Operacional MS-DOS, mas pode ser adaptado para outros sistemas.
       Ele lê a Porta Paralela LPT1 ininterruptamente enquanto nenhuma tecla for pressionada, e exibe na tela do computador o estado de cada bit do byte recebido a cada ciclo do laço while().

//Ler Porta Paralela LPT1:
#include <stdio.h>
#include <dos.h>
#define BIT0  0x01  // Não usado
#define BIT1  0x02  // Não usado
#define BIT2  0x04  // Não usado
#define BIT3  0x08  // Error
#define BIT4  0x10  // Slct out
#define BIT5  0x20  // Paper End
#define BIT6  0x40  // Ack
#define BIT7  0x80  // Busy
int main(void)
{
     int x=10,y=5; //Coluna e Linha do vídeo
     unsigned char Byte; //Para armazenar o byte recebido da Porta Paralela
     clrscr();
     gotoxy(30,1);   printf("RECEBENDO SINAIS...");
     gotoxy(30,20); printf("Pressione uma tecla para sair...");
     gotoxy(x, y);    printf("Bit 3 - Error....:");
     gotoxy(x,y+1); printf("Bit 4 - Slct out.:");
     gotoxy(x,y+2); printf("Bit 5 - Paper End:");
     gotoxy(x,y+3); printf("Bit 6 - Ack:.....:");
     gotoxy(x,y+4); printf("Bit 7 - Busy.....:");
     while( ! kbhit() )
     {
           Byte = inportb(0x379); //Ler um byte da Porta Paralela
           if((Byte & BIT3) == 0){     // Error
               gotoxy(x+20,y); printf("INATIVO");
           }else{
               gotoxy(x+20,y); printf("ATIVO      ");
           }
           if((Byte & BIT4) == 0){    // Slct out
               gotoxy(x+20,y+1); printf("INATIVO");
           }else{
               gotoxy(x+20,y+1); printf("ATIVO   ");
           }
           if((Byte & BIT5) == 0){    // Paper End
               gotoxy(x+20,y+2); printf("INATIVO");
           }else{
               gotoxy(x+20,y+2); printf("ATIVO   ");
           }
           if((Byte & BIT6) == 0){     // Ack
   
           gotoxy(x+20,y+3); printf("INATIVO");
           }else{
               gotoxy(x+20,y+3); printf("ATIVO   ");
           }
           if((Byte & BIT7) == 0){     // Busy
               gotoxy(x+20,y+4); printf("INATIVO");
           }else{
               gotoxy(x+20,y+4); printf("ATIVO   ");
           }
      }
      clrscr();
}



COMUNICAÇÃO ENTRE DOIS COMPUTADORES UTILIZANDO A PORTA PARALELA.

       Ao desenvolver um projeto utilizando a Porta Paralela, tenha sempre em mente, que o comprimento máximo do cabo paralelo é de somente 3m. Não utilize um comprimento maior que este, porque terá problemas com perda de dados.
       Um dos motivos mais prováveis, é que a corrente elétrica da saída da Porta Paralela é muito baixa, não sendo suficiente para drenar mais circuitos acoplados externamente à Porta. Se precisar de um cabo maior utilize-o com um amplificador de sinais.

Veja, na figura abaixo, as interligações de fios para fazer um cabo paralelo:

Confecção de um cabo paralelo para a comunicação entre dois computadores:

 

Software:
       O programa abaixo transmite um arquivo de um computador a outro, interligados através de um cabo paralelo.
       Este programa foi compilado com o C++Builder, más pode muito bem ser adaptado a um outro compilador, ou uma outra linguagem como, Delph, Visual Basic, etc.
       
       

Connect.cpp:

#include "vcl\condefs.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "Metodos.h"
#pragma hdrstop

//----------------------------------------------------------------------------------------------------------
//USERES("Connect.res");
USEUNIT("Metodos.cpp");
//----------------------------------------------------------------------------------------------------------
//Programa exemplo
int main(int argc, char **argv)
{
      TParalela  Lpt;     //Instancia objeto
      cout << "Envio de Arquivo através da Porta Paralela" << endl;
      cout << "------------------------------------------" << endl;
      if(argc < 3)
      {
            cout << "Ajuda:" << endl;
            cout << "Use: CONNECT E Nome_do_Arquivo\n"; //Quem envia
            cout << "Ou" << endl;
            cout << "Use: CONNECT R Nome_do_Arquivo\n"; //Quem recebe
       }
       Lpt.Envia(LPT1,BIT4); //Seta Busy == 0
       if(argv[1][0] == 'R' || argv[1][0] == 'r')
       {
            cout << "Estação pronta para Receber arquivo!" << endl;             Lpt.RecebeArquivo(argv[2]);
       }else{
            cout << "Estação pronta para Enviar arquivo!" << endl;             Lpt.EnviaArquivo(argv[2]);
       }
       return( 0 );
}

              
       A listagem abaixo é o protótipo da classe TParalela, que fará a comunicação entre dois computadores, através da porta paralela.

Metódos.h

#ifndef MetodosH
#define MetodosH
//--------------------------------------------------------------------------------------------------------
#include "vcl\SysUtils.hpp"
#include "vcl\Controls.hpp"
#include "vcl\Classes.hpp"
#define LPT1 0x378
// Endereço da LPT1=0x378, LPT2=0x278
#define BIT0 0x01
  //Não usado
#define BIT1 0x02
  //Não usado
#define BIT2 0x04  
 //Não usado
#define BIT3 0x08   
//Error
#define BIT4 0x10  
 //Slct out
#define BIT5 0x20  
 //Paper end
#define BIT6 0x40  
 //Ack
#define BIT7 0x80  
 //Busy

//--------------------------------------------------------------------------------------------------------
class TParalela
{

         public:
                  void Envia(unsigned short int PortaEnd, unsigned char Dado);
                  unsigned char Recebe(unsigned short int PortaEnd);
                  unsigned char RecebeNibble(void);
                  void EnviaNibble(unsigned char Byte);
                  void EnviaByte(unsigned char Byte);
                  unsigned char RecebeByte(void);
                  void EnviaTamanhoArq(long Tama);
                  int EnviaArquivo(char *NomeArquivo);
                  long RecebeTamanhoArq(void);
                  int RecebeArquivo(char *NomeArquivo);
};
#endif


           O código abaixo mostra os métodos ou funções que fazem parte da classe TParalela, descrita acima.  

Metodos.cpp:

#include "vcl\vcl.h"
#pragma hdrstop
#include "Metodos.h"
#include "stdio.h"
#include "dos.h"
#include "Sys\stat.h"
#include "stdlib.h"

//--------------------------------------------------------------------------------------------------------
// Envia um byte à porta paralela (Hardware)
//--------------------------------------------------------------------------------------------------------
void TParalela::Envia(unsigned short int PortaEnd, unsigned char Dado)
{
      _DX = PortaEnd;
      _AL = Dado;   //_AX = Dado;
      __emit__ (0xEE);
}
//--------------------------------------------------------------------------------------------------------
// Recebe um byte da porta paralela (Hardware)
//--------------------------------------------------------------------------------------------------------
unsigned char TParalela::Recebe(unsigned short int PortaEnd)
{
      _DX = PortaEnd;
      __emit__ (0xEC);
      return (_AL);
}
//--------------------------------------------------------------------------------------------------------
//Método que recebe 4 bits (1 Nibble) da porta paralela
//--------------------------------------------------------------------------------------------------------
unsigned char TParalela::RecebeNibble(void)
{
     unsigned char RetByte; //Byte lido
     unsigned char Byte;
     do{
              RetByte = Recebe(LPT1+1); //0x379 Status
     }while(RetByte & BIT7); //Aguarda Busy ser 1
     Envia(LPT1,0x00); //Seta D4 = 0 (zero)
     do{
           RetByte = Recebe(LPT1+1);
     }while(!(RetByte & BIT7)); // Aguarda Busy ser 0 (zero)
     RetByte = Recebe(LPT1+1); // Le o dado
     Byte = (unsigned char)((RetByte >> 3) & 0x0f); // Decodifica o Nibble
     Envia(LPT1,BIT4); // Sinaliza com D4 = 1 Slct out
     return(Byte); //Retorna o Nibble lido
}
//--------------------------------------------------------------------------------------------------------
//Método que envia 4 bits (1 Nibble) pela porta paralela
//--------------------------------------------------------------------------------------------------------
void TParalela::EnviaNibble(unsigned char Byte)
{
     unsigned char RetByte; //Byte lido
     do {
              RetByte = Recebe(LPT1+1);
     }while(!(RetByte & BIT7)); // Aguarda Busy ser 0 (zero)
     Envia(LPT1,(unsigned char)(Byte & 0x0f)); // Envia dado
     do{
              RetByte = Recebe(LPT1+1);
     }while(RetByte & BIT7); // Aguarda Busy ser 1
     Envia(LPT1,0x10); // Envia D4 = 1
}
//--------------------------------------------------------------------------------------------------------
//Envia um Byte pela porta Paralela
//--------------------------------------------------------------------------------------------------------
void TParalela::EnviaByte(unsigned char Byte)
{
     unsigned char BaixoByte;
     BaixoByte = (unsigned char)(Byte >> 4); // Pega o nibble mais significativo      EnviaNibble(Byte); // Envia o nibble menos significativo
     EnviaNibble(BaixoByte); // Envia o nibble mais signivicativo
}
//--------------------------------------------------------------------------------------------------------
//Recebe um byte pela porta Paralela
//--------------------------------------------------------------------------------------------------------

unsigned char TParalela::RecebeByte(void)
{
      unsigned char MontaByte;
      unsigned char NibbleBaixo;
      unsigned char NibbleAuto;
      NibbleBaixo = (unsigned char)(RecebeNibble() & 0x0F); //Le nibble - signifi.       NibbleAuto = (unsigned char)(RecebeNibble() & 0x0F); //Le nibble + signifi.
      NibbleAuto = (unsigned char)((NibbleAuto << 4) & 0xF0);
      MontaByte = NibbleBaixo | NibbleAuto;
      return(MontaByte);
}
//--------------------------------------------------------------------------------------------------------
//Envia o tamanho do arquivo
//--------------------------------------------------------------------------------------------------------
void TParalela::EnviaTamanhoArq(long Tama)
{
     union {
               unsigned long Tamanho;
               unsigned char TamanhoByte[4];
     }Arquivo;
    Arquivo.Tamanho = Tama;
    EnviaByte(Arquivo.TamanhoByte[0]);
    EnviaByte(Arquivo.TamanhoByte[1]);
    EnviaByte(Arquivo.TamanhoByte[2]);
    EnviaByte(Arquivo.TamanhoByte[3]);
}
//--------------------------------------------------------------------------------------------------------
//Envia os dados do arquivo
//--------------------------------------------------------------------------------------------------------
int TParalela::EnviaArquivo(char *NomeArquivo)
{
      FILE *ArqLer;
      unsigned char Caractere;
      struct stat Buffer;
      long Tamanho;
      if((ArqLer=fopen(NomeArquivo,"rb")) == NULL)
     {
         return(-1); //Erro de leitura do arquivo.
     }
     stat(NomeArquivo,&Buffer);
     Tamanho = Buffer.st_size;
     cout << "Tamanho do arquivo: " << Tamanho;
     EnviaTamanhoArq(Tamanho);
     while(Tamanho--)
     {
         Caractere = (unsigned char)fgetc(ArqLer);
         EnviaByte(Caractere);
     }
     fcloseall();
     return(0); //Ok
}
//--------------------------------------------------------------------------------------------------------
//Recebe o tamanho do arquivo
//--------------------------------------------------------------------------------------------------------
long TParalela::RecebeTamanhoArq(void)
{
     union {     //Divide o long em 4 bytes
            unsigned long Tamanho;
            unsigned char TamanhoByte[4];
     }Arquivo;
     Arquivo.TamanhoByte[0] = RecebeByte(); //byte menos significativo      Arquivo.TamanhoByte[1] = RecebeByte(); //do long.
     Arquivo.TamanhoByte[2] = RecebeByte();
     Arquivo.TamanhoByte[3] = RecebeByte(); //byte mais significativo
     return(Arquivo.Tamanho);
}
//--------------------------------------------------------------------------------------------------------
//Recebe um arquivo pela paralela
//--------------------------------------------------------------------------------------------------------
int TParalela::RecebeArquivo(char *NomeArquivo)
{
       FILE *ArqGrava;
       unsigned long tamanho;
       unsigned char RetByte;
       cout << "Ative a estação cliente.";
       do{
            RetByte = Recebe(LPT1+1);
       }while(RetByte & BIT7); //Busy
       if((ArqGrava=fopen(NomeArquivo,"wb")) == NULL)
       {
           return(-1); //Erro ao gravar o arquivo.
       }
       tamanho = RecebeTamanhoArq();
       cout << "\nTamanho do arquivo: " << tamanho;
       while(tamanho)
       {
           RetByte = RecebeByte();
           fputc(RetByte,ArqGrava);
           tamanho--;
       }
       fcloseall();
       return(0); //Ok
}

 


Adaptado e implentado por: Catalunha. site: http://www.catalunha.eng.br. email: catalunha@catalunha.eng.br
Desenvolvido por : Antônio Rogério Messias. © Copyright, 1999 ROGERCOM. Todos os Direitos Reservados - All Rights Reserved.