La Web del Programador: Comunidad de Programadores
 
    Pregunta:  88 - ENVIAR DATOS A TRAVÉS DEL PUERTO PARALEL
Autor:  Jesus
Quisiera saber como podía hacer mis circuitos eléctricos y controlarlos por un programa mío en C++.
Para ello, querría saber como enviar un 0 ó un 1 a través del puerto paralelo.
Os ruego que contestéis. Gracias. :-)

  Respuesta:  Rosalío Morales Rizo
Pues yo he utilizado las funciones de C
inportb y outportb (para 8 bits) bajo Visual C
y no hay ningun problema, bueno el problema se
presentaria si corres tu programa bajo un NT (por aquello de las peticiones de acceso a puertos...)

Por lo general la dirección de salida para un puerto paralelo se encuentra en la 0x378... asi que si quieres "activar" el bit uno del puerto paralelo (pin 2 del DB25), podría ser:
outportb(0x378,1);

Ahora bien, si lo que deseas es leer un dato, la entrada esta por lo general en la 0x379 (esto depende de la dirección fisica de tu puerto paralelo...) mmhh no todos los bits de este registro son de entrada, y uno esta invertido...
podrias leer entonces con algo como
mi_variable=inportb(0x379);

Yo he podido leer 8 datos del puerto paralelo
juntando la información de la dirección 0x379 y
0x37A...

Nota: Las direcciones que pongo no son absolutas
cambian de ordenador a ordenador... (asi como puede encontrarse a partir de la dirección 0x378, puede ser que este en la 0x3BC, 0x278,0x2BC,...)

  Respuesta:  Armando Nava
Es muy sencillo en C cuentas con la funcion

outport(889,2);
/*Envias un 00000010 a los pines de salida */


/*la configuracion de puerto la puedes encontrar en algun libro de ensamble de computadoras */

//y para leer el puerto

unsigned int dato=inport(888);

  Respuesta:  Pachi
Yo he logrado enviar datos a través del puerto paralelo, a través de una dll (Win95io.dll), si me proporcionas tu dirección electrónica, te la paso, yo le he programado en VB4, pero supongo que no será un problema.

  Respuesta:  Julio Alejandro
Es fácil, solo tienes que direccionar el puerto de salida y el dato de tipo caracter, si sabes Hexadecimal o Binario podrás fácilmente manipular los 8 bits, esta función esta provada en C++ 3.0
void Out(unsigned char dato)
{ asm{
mov  dx,0378h
in al,dx
xor al,dato
out dx,al
}
}
Ademas realiza una Or Exclusiva para que si algún pin estaba en 1, lo pone a 0 o si ya había algun dato, lo mantiene. Gracias

  Respuesta:  Cesar Quispe
No si tengas nocion de assembler, conocerlo te da mas posibilidades de entenderlo y luego pasarlo a c++ es mas facil, si es asi me gustaria me escribas.

El enviar datos por el puerto paralelo es bastante facil, lo unico que tiene que verificar es el puerto presente el el pc, los mas conocidos son 3bch, 278h y 378h, esto lo puedes averiguar utilizando el MSD del DOS.

En assembler:

**Describire lo que hace el programa:
1.-Carga la direccion de la variable puerto en dx(puerto debe ser alguna direccion ej. 3bch),que el puerto de la impresora este presente en el PC.
2.-Luego lee si se ha presionado alguna tecla, si no es asi permanece en un blucle hasta que se presione una tecla.
3.-Si la tecla presionada es la tecla Esc ( 1bh) termina el programa.
4.-Se imprime el dato por pantalla , si es otro dato.
5.-Se envia el dato que se encuentra en AL(registro AL).
6.- regresa al inicio.
7.-Fin

Nota: Como se habra notado el programa acepta todo tipo de datos,pero el que lo desee probar debera hacerlo solo con numeros.Este programa lo he empledo para ver lo que envio y comprobar si es el dato que encuentro a la salida, y ¿como?, facil coloquen un led ala salida de de cada uno de los pines que conforman el bus de datos de la impresora y verifiquen.

Codigo segment
Assume cs:codigo
inicio:
vez: mov dx,puerto ; (1)
leo:mov ah,01h ; (2)
int 16h
jnz leo
cmp al,1bh ; (3)
je FIN
mov dl,al ; (4)
mov ah,2
int 21h
OUT dx,al ; (5)
jmp vez ; (6)
FIN: mov ah,4ch ; (7)
int 21h
codigo ends
end inicio
EN C++
/* programa que envia caracteres */
#include
#include

unsigne char valor; /* variable usada para enviar datos sin signo*/

main()
{
int a;
for (a=0;a<=10;a++) /* para enviar 10 datos */
{
printf("Ingrese el dato %a a enviar\n",a);
scanf("%c",&valor);
outportb(0x3bc,valor); //envia el dato contenido en valor
}
}

No he tenido tiempo de probarlo,actualmente trabajo en un programa utilizando el puerto paralelo , si tienes algun problema puedes escribirme