PUCRS
Programação de Software Básico
Faculdade de Informática



Acesso  à Porta Paralela


O exemplo abaixo permite o acesso direto à porta parala do PC. Você pode obter o fonte neste link.
O programa foi testado com o compilador G++ tanto em Windows quanto em Linux.
Para ter acesso à porta paralela, utilizando o Windows, deve-se utilizar esta DLL.


    
// **************************************************
// PROGRAMAÇÃO DE SOFTWARE BÁSICO
//             Paralela2.cpp
// Exemplo de programa de acesso à porta paralela.
// Este programa foi testado com o compilador G++,
// tanto em ambiente Windows quanto em Linux.
// **************************************************
#include <iostream>
#ifdef WIN32
  // compila para o Windows
  #include <windows.h>
  #include <io.h>  // para glibc   
#else
  // compila para Linux
  #include <sys/io.h>  // para glibc   
#endif

using namespace std;

#ifdef WIN32
  //what does these typedefs do???
  typedef short (_stdcall *inpfuncPtr)(short portaddr);
  typedef void (_stdcall *oupfuncPtr)(short portaddr, short datum);

  HINSTANCE hLib;
 
  inpfuncPtr inp32fp;
  oupfuncPtr oup32fp;
#endif

void testaParalela()
{
  #ifdef WIN32
    hLib = LoadLibrary("inpout32.dll");
    if (hLib != NULL)
    {
      cout << "DLL carregada com sucesso !!!" << endl;
    }
    else
    {
      cout << "Problemas ao carregar a DLL !!!" << endl;
      cout << "Encerrando aplicação..." << endl;
      exit(1);
    }

    inp32fp = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
    if (inp32fp != NULL)
    {
      cout << "Função 'Inp32' encontrada !" << endl;
    }
    else
    {
      cout << "Problemas para obter o endereço da função 'Inp32'..." << endl;
      cout << "Encerrando aplicação..." << endl;
      exit(1);
    }
  
    oup32fp = (oupfuncPtr) GetProcAddress(hLib, "Out32");
    if (oup32fp != NULL)
    {
      cout << "Função 'Out32' encontrada !" << endl;
    }
    else
    {
      cout << "Problemas para obter o endereço da função 'Out32'..." << endl;
      cout << "Encerrando aplicação..." << endl;
      exit(1);
    }
  #else
    if(ioperm(0x378, 3, 1) == 0) //  Liberando 3 portas: 0x378, 0x379 e 0x37A
    {
      cout << "Permissão de portas concedida!!!" << endl;
    }
    else
    {
      cout << "Problemas ao liberar portas..." << endl;
      cout << "Encerrando aplicação..." << endl;
      exit(1);
    }
  #endif  
}

short Inp32 (short portaddr)
{
  #ifdef WIN32
    return (inp32fp)(portaddr);
  #else
    return inb(portaddr);
  #endif
}

void Out32 (short portaddr, short datum)
{
  #ifdef WIN32
    (oup32fp)(portaddr,datum);
  #else
    outb(datum, portaddr);
  #endif
}

int main(void)
{
  char c;
  cout << "Iniciando...." << endl;

  testaParalela();

  cout << "Pressione qualquer tecla para continuar..." << endl;
  cin.get(c);

  Out32(0x378,10);
  do
  {
    cout << Inp32(0x379) << endl ;
  } while (1);

  #ifdef WIN32
    FreeLibrary(hLib);
  #endif

  return 0;
}