Leer datos por el puerto paralelo

Seguir
Buen día a todos
Antes que nada gracias por la ayuda que me puedan prestar.
Estuve leyendo en los foros que habia alguien que queria conectar un aparato que le
envia una impresión de datos y los queria recibir en una P.C.
Yo quiero hacer lo mismo con unos medidores de humedad, quisiera saber como puedo
hacer esto, he estado haciendo programss en java, c, c++, c# y no logro hacerlo, ya se que cambian C5 del puerto paralelo puedo recibir datos por el registro de Datos

Gracias

1 Solución propuesta

SOLUCIÓN ACEPTADA
para escribir en el puerto paralelo tienes que escribir en el numero de puerto
0x378, y para leer desde el 0x379
por ejemplo
outportb(0x378, 0x01); /* DATOS DE SALIDA AL PÚERTO PARALELO */
valor_pp = inportb(0x379);
Nota para poder usar estas funciones tienes que incliur a dos.h

Para saber mas sobre el puerto paralelo busca en google.


te paso este codigo que hice hace añños en la U, como trabajo
controla un brazo brazo mediante el puerto paralelo, revisalo quizas te sirva de algo

/* Hecho por Raul Alfaro para la materia de ingenieria de procesos */
/* Promagra hecho en turbo c para controlar el movimiento del brazo */


#include<graphics.h> /* algunas funciones graficas */
#include<conio.h> /* para getch */
#include<ctype.h> /* para toupper */
#include<dos.h> /* para inportb y outportb */


void terminar_programa(void); /* para terminar el programa */
void borrar_texto(void); /* para borrar texto */
void menu(void); /* para seleccionar */
void iniciar_control(void); /* iniciar el brazo */

void borde(int, int, int, int, int); /* borde externo */
void ventanita(int, int, int, int, int); /* pequeña ventana */

void crear_ventana(int, int, int, int); /* crea todas las ventanas */


#define pantalla outtextxy /* pantalla es lo mismo que outtextxy pero para comodidad le cambiamos el nombre */

#define DERECHA 77 /* tecla derecha */
#define IZQUIERDA 75 /* tecla izquierda */
#define ARRIBA 72 /* tecla de arriba */
#define ABAJO 80 /* tecla abajo */


typedef int coordenadas; /* coordenadas totales del monitor, coordenadas es un tipo int (entero) */

char op = 'F'; /* para salir del proceso */

void main(void)
{
int modo, controlador; /* controlador = VGAHI, modo 640x480 pixeles */

coordenadas x1, y1, x2, y2; /* limites */

detectgraph(&controlador, &modo); /*trabajar en el modo grafico por defecto */

initgraph(&controlador, &modo, ""); /* carga en memoria un controlador el VGAHI */

/* definicion de limites */

x1 = 0;
x2 = 640;
y1 = 0;
y2 = 480;

crear_ventana(x1, y1, x2, y2); /* creamos la primera ventana */

}
void crear_ventana(int x1, int y1, int x2, int y2)
{
borde(x1, y1, x2, y1+65, CYAN);
borde(x1, y1, x2, x1+105, CYAN);

setcolor(YELLOW);
settextstyle(DEFAULT_FONT, HORIZ_DIR, 0); /* tipo de letra */

pantalla(249, 25, "CONTROL DE BRAZO");
pantalla(225, 40, "INGENIERIA DE PROCESOS");

setpalette(15, WHITE);
setviewport(x1, y1, x2, y2, 1); /* crea una ventana */
borde(x1, y1, x2, y2, CYAN); /* le damos un borde */

if(op != 'F')
iniciar_control();
else
menu(); /* para escoger una opcion */
}
void menu(void)
{
char opcion;

for(; /* bucle infinito */
{
do
{
setcolor(RED);
pantalla(30, 80, "Elija una opcion:");
setcolor(YELLOW);
pantalla(200, 80, "(E)ncender brazo");
setcolor(GREEN);
pantalla(370, 80, "(T)erminar programa");
opcion = toupper(getch());
}while(opcion != 'E' && opcion != 'T');
switch(opcion)
{
case 'E':
borrar_texto();
iniciar_control();
break;
case 'T':
terminar_programa();
}
}
}
void iniciar_control(void)
{
int tecla;

setcolor(WHITE);
pantalla(30, 130, "PRESIONE LAS TECLAS DE DIRECCIONES PARA MOVER EL BRAZO");
pantalla(30, 145, "A PARA APAGAR BRAZO");

do
{
tecla = toupper(getch());

if(tecla == DERECHA)
{
pantalla(30, 165, "MOVIENDO BRAZO A LA DERECHA");
outportb(0x378, 0x01); /* DATOS DE SALIDA AL PÚERTO PARALELO */
delay(250);
outportb(0x378, 0x00);
}
if(tecla == IZQUIERDA)
{
pantalla(30, 180, "MOVIENDO BRAZO A LA IZQUIERDA");
outportb(0x378, 0x02);
delay(250);
outportb(0x378, 0x00);
}
if(tecla == ARRIBA)
{
pantalla(30, 195, "ELEVANDO BRAZO");
outportb(0x378, 0xab);
delay(250);
outportb(0x378, 0x00);
}
if(tecla == ABAJO)
{
pantalla(30, 210, "BAJANDO BRAZO");
outportb(0x378, 0xba);
delay(250);
outportb(0x378, 0x00);
} borrar_texto();

}while(tecla != 'A');

pantalla(30, 440, "APAGANDO BRAZO");

}
void borde(int xini, int yini, int xfin, int yfin, int color)
{
setfillstyle(1, color);

bar(xini, yini, xfin, xini+8); /* linea arriba */

bar(xini, yfin-8, xfin, yfin); /* linea de abajo */

bar(xini, yini, xini+10, yfin); /* linea izquierda */

bar(xfin-10, yini, xfin, yfin); /* linea derecha */
}
void ventanita(int x1, int y1, int x2, int y2, int color)
{
register int t;

setcolor(color);

for(t=0;t<=4;t++)
{
line(x1, y1+t, x2, y1+t); /* linea de arriba */
line(x1, y2-t, x2, y2-t); /* linea de abajo */
line(x1+t, y1, x1+t, y2); /* linea izquierda */
line(x2-t, y1, x2-t, y2); /* linea derecha */
}
}
void terminar_programa()
{
setcolor(WHITE);
settextstyle(GOTHIC_FONT, HORIZ_DIR, 0);
pantalla(120, 420, "HASTA LUEGO MUCHACHOS");
getch();
restorecrtmode();
exit(0);
}
void borrar_texto()
{
setcolor(BLACK);
pantalla(30, 165, "MOVIENDO BRAZO A LA DERECHA");
pantalla(30, 180, "MOVIENDO BRAZO A LA IZQUIERDA");
pantalla(30, 195, "ELEVANDO BRAZO");
pantalla(30, 210, "BAJANDO BRAZO");
pantalla(30, 440, "APAGANDO BRAZO");
}

tambien este otro que controla el nivel y temperatura del agua revisalo, pues ami me funciono.
/* *
* Programa que controla el nivel y temperatura del agua escrita por *
* Raul Alfaro en Turbo C 2.01 y solo utilizar este compilador *
* *
*/


#include<graphics.h> /* algunas funciones graficas */
#include<conio.h> /* para getch */
#include<ctype.h> /* para toupper */
#include<dos.h> /* para inportb y outportb */


void terminar_programa(void);
void menu(void);
void inicia_proceso(void);

void agua(int);
void hervir_agua(int);
void mostrar_resistencia(int);
void dibujar_tanque(int);

void borde(int, int, int, int, int);
void ventanita(int, int, int, int, int);

void crear_ventana(int, int, int, int);

unsigned leer_puerto_p(int);

#define pantalla outtextxy

typedef unsigned bits;
typedef int coordenadas;

char op = 'F';

void main(void)
{
int modo, controlador;

coordenadas x1, y1, x2, y2;

detectgraph(&controlador, &modo); /*trabajar mas en el grafico*/

initgraph(&controlador, &modo, ""); /* carga en memoria un controlador */


x1 = 0;
x2 = 640;
y1 = 0;
y2 = 480;

crear_ventana(x1, y1, x2, y2);

}
void crear_ventana(int x1, int y1, int x2, int y2)
{
borde(x1, y1, x2, y1+65, CYAN);
borde(x1, y1, x2, x1+105, CYAN);

setcolor(YELLOW);
settextstyle(DEFAULT_FONT, HORIZ_DIR, 0);

pantalla(170, 25, "CONTROL DE NIVEL Y TEMPERATURA DEL AGUA");
pantalla(225, 40, "INGENIERIA DE PROCESOS");

setpalette(15, WHITE);
setviewport(x1, y1, x2, y2, 1); /* crea una ventana */
borde(x1, y1, x2, y2, CYAN); /* le damos un borde */

if(op != 'F')
inicia_proceso();
else
menu(); /* para escoger una opcion */
}
void menu(void)
{
char opcion;

for(;
{
do
{
setcolor(RED);
pantalla(30, 80, "Elija una opcion:");
setcolor(YELLOW);
pantalla(200, 80, "(I)niciar proceso");
setcolor(GREEN);
pantalla(370, 80, "(T)erminar");
opcion = toupper(getch());
}while(opcion != 'I' && opcion != 'T');
switch(opcion)
{
case 'I':
inicia_proceso();
break;
case 'T':
terminar_programa();
}
}
}
void inicia_proceso(void)
{
bits na, nb, st, comp_bit;

comp_bit = 1;

setcolor(LIGHTBLUE);
pantalla(30, 120, "HOLA");
pantalla(90, 120, "INICIANDO PROCESO");

ventanita(400, 107, 628, 469, BLUE);
dibujar_tanque(WHITE);

/* asegurarse que pi=1 no haya corriente y pa=0 este cerrada */
/*outportb(0x378, 0x80);*/

pantalla(30, 140, "no hay coriente pi=1 valvula cerrada pa=0");

mostrar_resistencia(BLACK);

setcolor(YELLOW);
pantalla(30, 160, "Me asegure que la resistencia este apagada");
pantalla(30, 170, "y la valvula este cerrada");

do
{
pantalla(30, 180, "!Llene tanque­ ....... por favor");
na = leer_puerto_p(2); /* leer na bit 0 */
}while(na != comp_bit); /* si tanque lleno */

agua(LIGHTBLUE);
pantalla(30, 200, "Tanque lleno, gracias");

lee_st:

pantalla(30, 220, "Verificando temperatura del agua");

st = leer_puerto_p(1); /* lee sensor de temperatura bit 1 */

if(st == comp_bit) /* si hay temperatura deseada */
{
hervir_agua(LIGHTBLUE);
pantalla(30, 240, "Agua hirviendo");
getch();
/* poner pa=1 y dejar pasar agua y pi=1 no pasar corriente */
/*outportb(0x378, 0xc0);*/

pantalla(30, 260, "pa=1 y pi=1");
pantalla(30, 280, "Abriendo valvula y apagando resistencia");
mostrar_resistencia(BLACK);
getch();
hervir_agua(BLACK);
getch();
agua(BLACK);

do
{
pantalla(30, 300, "Estoy esperando a que se vacie el tanque");
nb = leer_puerto_p(0); /* leer nb bit 2 */
}while(nb != comp_bit); /* si tanque vacio */

pantalla(30, 320, "El tanque ya esta vacio");
agua(BLACK);

/*outportb(0x378, 0x80);*/ /* cerrar pa = 0 no pasa agua */
pantalla(30, 330, "pa=0 cerrar valvula");

pantalla(30, 340, "Cerrando valvula");
pantalla(30, 360, "Presione la tecla (F) para finalizar proceso");
pantalla(30, 380, "Si desea continuar con el proceso");
pantalla(30, 400, "presione cualquier otra tecla");

op = toupper(getch());
clearviewport();

if(op == 'F')
{
crear_ventana(0, 0, 640, 480); /* termina el proceso */
}
else
{
crear_ventana(0, 0, 640, 480);
}
}
else /* si no hay temperatura deseada */
{
pantalla(30, 430, "Temperatura aun no deseada");
/*outportb(0x378, 0x00);*/ /* pi=0 si hay corriente */
pantalla(30, 450, "pi=0 si hay corriente");
pantalla(30, 4700, "Encendiendo la resistencia");
mostrar_resistencia(YELLOW);
goto lee_st;
}
}
bits leer_puerto_p(int pos_bit)
{
bits bit;

struct bits_pp
{
bits st : 1;
bits nb : 1;
bits na : 1;

bits su : 5;
};

struct bits_pp byte;

union bp
{
struct bits_pp byte;
char valor_pp;
}ubit;

ubit.valor_pp = inportb(0x379);

if(pos_bit == 2)
{
bit = ubit.byte.na;

}
if(pos_bit == 1)
{
bit = ubit.byte.st;
}
if(pos_bit == 0)
{
bit = ubit.byte.nb;
}

return bit;
}
void borde(int xini, int yini, int xfin, int yfin, int color)
{
setfillstyle(1, color);

bar(xini, yini, xfin, xini+8); /* linea arriba */

bar(xini, yfin-8, xfin, yfin); /* linea de abajo */

bar(xini, yini, xini+10, yfin); /* linea izquierda */

bar(xfin-10, yini, xfin, yfin); /* linea derecha */
}
void ventanita(int x1, int y1, int x2, int y2, int color)
{
register int t;

setcolor(color);

for(t=0;t<=4;t++)
{
line(x1, y1+t, x2, y1+t); /* linea de arriba */
line(x1, y2-t, x2, y2-t); /* linea de abajo */
line(x1+t, y1, x1+t, y2); /* linea izquierda */
line(x2-t, y1, x2-t, y2); /* linea derecha */
}
}
void dibujar_tanque(int color)
{
setcolor(color);
pantalla(450, 120, "Valdesito");

line(540, 200, 540, 380); /* derecha */
line(430, 380, 540, 380); /* abajo */
line(430, 200, 430, 380); /* izquierda */

}
void mostrar_resistencia(int color)
{
register int t;
int x, y;

x = 450;
y = 400;

setcolor(WHITE);
setfillstyle(1, color);

for(t=0;t<80;t+=10)
{
fillellipse(x+t, y, 6, 14);
}

if(color == YELLOW)
{
setcolor(BLACK);
pantalla(410, 430, "Resistencia encendida");
pantalla(410, 430, "Resistencia apagada");
setcolor(WHITE);
pantalla(410, 430, "Resistencia encendida");
}
else
{
setcolor(BLACK);
pantalla(410, 430, "Resistencia apagada");
pantalla(410, 430, "Resistencia encendida");
setcolor(WHITE);
pantalla(410, 430, "Resistencia apagada");
}
}
void agua(int color)
{
register int t;
setcolor(color);

if(color == LIGHTBLUE)
{
for(t=379;t>=220;t--)
{
line(431, t, 539, t);
delay(800);
}
setcolor(BLACK);
pantalla(410, 442, "Tanque con agua");
pantalla(410, 442, "Tanque sin agua !llenela­");
setcolor(WHITE);
pantalla(410, 442, "Tanque con agua");
}
else
{
for(t=220;t<=379;t++)
{
line(431, t, 539, t);
delay(800);
}
setcolor(BLACK);
pantalla(410, 442, "Tanque sin agua !llenela­");
pantalla(410, 442, "Tanque con agua");
setcolor(WHITE);
pantalla(410, 442, "Tanque sin agua !llenela­");
}
}
void hervir_agua(int color)
{
register int t, x, y;

for(t=0;t<=100;t+=10)
{
for(x=(430+t);x<=(430+t+5);x++)
{
for(y=130;y<=198;y++)
{
putpixel(x, y, color);

}
}
}

setcolor(color);
setfillstyle(1, color);
arc(442, 220, 0, 360, 3);
arc(472, 220, 0, 360, ;
arc(502, 220, 0, 360, 7);
arc(532, 220, 0, 360, 5);
}
void terminar_programa()
{
setcolor(WHITE);
settextstyle(GOTHIC_FONT, HORIZ_DIR, 0);
pantalla(150, 420, "CHAAAUUUUU");
getch();
restorecrtmode();
exit(0);
}[/code][/list]