Te mando estos programitas que me sirvieron para hacer unas pruebas con el puerto paralelo (los hice hace bastante) y funcionaron bien, leen y escriben en el puerto. Ojo, tienen que ejecutarse como root por lo tanto no son muy seguros (adem�s no prest� mucha atenci�n al tema de seguridad ya que eran solo una prueba).
Miralos y buscate la info que hay en la inet que es mucha


Eduardo Daniel Ibarra wrote:

   ----------------------------------
   AYUDA con la funci�n inb()
   para leer 5 Volts en alg�n pin del
   conector de Puerto Paralelo.
   -----------------------------------

   Hola:

   Necesito ayuda urgente sobre c�mo
leer se�ales de 5 Volts en el Puerto Paralelo.
(Entrada de ficha DB-25, de 25 pines)

  Estuve mirando man-p�ginas y bajando varios
documentos de la red, pero no hay caso,
��� no puedo registrar voltaje
en los pines del Pto. Paralelo. Ahhhh!!!

   ��� Qu� es lo que estoy haciendo mal ???
   Tengo Linux Debian Potato (Kernel 2.2.17).

   El puerto S� responde, ya que cuando
al Bus de Datos (a sus pines) le env�o
una se�al, obtengo los 5 Volts en cualquiera
de sus pines de datos (desde el 2 hasta el 9).

  Espero alguien me ayude, dado mi estado
catat�nico actual. Desde ya, muchas gracias...

                            Eduardo.

-------------------------------------------
   El programa en detalle es:

-----------------------------------------------
#include <stdio.h>
#include <sys/io.h>
#include <unistd.h>

#define BASE    (0x378)
#define ESTADO  BASE+1
#define CONTROL BASE+2

void main ()
        {
        int Dato;

        // Solicitamos permiso para habilitar el puerto (apertura):
        if (ioperm (BASE, 3 , 1) != 0) {
                printf ("\n ERROR");
                exit (1);}

        // Poner a Masa Pines:
        outb (0x0B, BASE+1); //(BASE+1) es la direccion del Bus de CONTROL.

        // Lectura de datos por Puerto Paralelo:
        for (int i=0; i<60; i++)
                {
                //Dato = Leer_Datos_PP ();
                //Dato = inb (BASE);
                //Dato = ((inb(ESTADO)^0x80) >> 3);

                // Lectura del PIN 10 (bit [6] del registro de Estado):
                // Pongo un voltaje de 5 Volts en pin 10:
                Dato = inb(ESTADO) & 0x40;

                printf ("\n Dato = %d = %c = %h.", Dato, Dato, Dato);
                sleep (1); // Esperar 1 segundo.
                }

        // Solicitamos permiso para deshabilitar el puerto (cierre):
        if (ioperm (BASE, 3 , 0) != 0) printf ("\n ERROR");
        }

------------------------------------------------



--
 H�ctor Andr�s Rompato Carricart <[EMAIL PROTECTED]>
 Coordinador t�cnico
 COVIARES S.A. -- Autopista La Plata - Buenos Aires
 Gerencia de equipos y sistemas

 Av. Espa�a y Autopista, Quilmes (1878)
 Buenos Aires, Argentina



#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>

#define LP0 0x3BC
#define LP1 0x378

int buscar_puerto(void);
void escribir_dato(int dato, int puerto);
int leer_dato(int puerto);

int buscar_puerto(void)
        {
        int puerto, i;
        
        if(ioperm(LP0, 3, 1) == -1)
                {
                perror("ioperm");
                exit(1);
                }
        outb(0xaa, LP0);
        i = inb(LP0);
        if(i != 0xaa)
        {
                ioperm(LP0, 3, 0);
                if(ioperm(LP1, 3, 1) == -1)
                        {
                        perror("ioperm");
                        exit(1);
                        }
                outb(0xaa, LP1);
                i = inb(LP1);
                if(i != 0xaa)
                        {
                        ioperm(LP1, 3, 0);
                        printf("No se encuentran puertos paralelos .....");
                        exit(1);
                        }
                puerto = LP1;
                }
        else
                puerto = LP0;
        return puerto;
        }

void escribir_dato(int dato, int puerto)
        {
        outb(0xFF, dato);
        outb(0x0A, dato + 2);
        outb(0x0E, dato + 2);
        }

int leer_dato(int puerto)
        {
        

#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>
#include <math.h>

#define LP0 0x3BC
#define LP1 0x378

int main(void)
{
    int i, salida;
    int data, estado, control;
    
    system("clear");
    if(ioperm(LP0, 3, 1) == -1)
        {
        perror("ioperm");
        exit(1);
        }
    outb(0xaa, LP0);
    sleep(1);
    i = inb(LP0);
    if(i != 0xaa)
        {
        ioperm(LP0, 3, 0);
        if(ioperm(LP1, 3, 1) == -1)
            {
            perror("ioperm");
            exit(1);
            }
        outb(0xaa, LP1);
        sleep(1);
        i = inb(LP1);
        if(i != 0xaa)
            {
            ioperm(LP1, 3, 0);
            printf("No se encuentran puertos paralelos .....");
            exit(1);
            }
        data = LP1;
        estado = LP1 + 1;
        control = LP1 + 2;
        }
    else
        {
        data = LP0;
        estado = LP0 + 1;
        control = LP0 + 2;
        }
    printf("\nReseteando el puerto %0X ...", data);
    outb(0xFF, data);
    outb(0x0A, control);
    outb(0x0E, control);
    sleep(1);
    printf("\nEncendiendo LED's ...");
    salida = 0xFF;
    for(i = 0; i <= 7; i++)
        {
        salida = salida ^ (int)pow(2,i);
        outb(salida, data);
        outb(0x0A, control);
        outb(0x0E, control);
        printf("\nLED %d", salida);
        sleep(1);
        }
    for(i = 7; i >=0; i--)
        {
        salida = salida | (int)pow(2,i);
        outb(salida, data);
        outb(0x0A, control);
        outb(0x0E, control);
        printf("\nLED %d", salida);
        sleep(1);
        }
    ioperm(data, 3, 0);
    printf("Presione ENTER para salir del programa");
    getchar();
    return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>
#include <math.h>

#define LP0 0x3BC
#define LP1 0x378

int main(void)
{
    int i;
    int data, estado, control;
    
    system("clear");
    if(ioperm(LP0, 3, 1) == -1)
        {
        perror("ioperm");
        exit(1);
        }
    outb(0xaa, LP0);
    sleep(1);
    i = inb(LP0);
    if(i != 0xaa)
        {
        ioperm(LP0, 3, 0);
        if(ioperm(LP1, 3, 1) == -1)
            {
            perror("ioperm");
            exit(1);
            }
        outb(0xaa, LP1);
        sleep(1);
        i = inb(LP1);
        if(i != 0xaa)
            {
            ioperm(LP1, 3, 0);
            printf("No se encuentran puertos paralelos .....");
            exit(1);
            }
        data = LP1;
        estado = LP1 + 1;
        control = LP1 + 2;
        }
    else
        {
        data = LP0;
        estado = LP0 + 1;
        control = LP0 + 2;
        }
    while(1)
        {
        outb(0x2D, control);
        outb(0x25, control);
        printf("\n\nValor en el puerto %0X: %0X", data, inb(data));
        system("clear");
        }
    outb(0x0D, control);
    ioperm(data, 3, 0);
    printf("Presione ENTER para salir del programa");
    getchar();
    return 0;
}

Responder a