# Leer datos del puerto paralelo



## hma

estoy haciendo una aplicacion donde necesito capturar datos y enviarlos a la pc y esta se encarga de analizarlos,  la idea es poder ingresar los 8 bits del conversor ad en paralelo mediante el puerto paralelo usando el registro de datos, los ppines 2 al 9, en todos lados aparecen coom solo salida, pero he leido que el puerto tiene la capacidad de ser bidireccional, por lo que pueden ingresarse datos por estos pines. la pregunta es entonces, ¿alguien sabe como hacer esto? porque todavia no encontrado como hacerlo y llevo un tiempo buscando información.


----------



## El nombre

En XP no funciona. Se consigue colocandoa uno el Bit 5 del Byte de control.
Saludos


----------



## led_led

Gracias EL NOMBRE, pero podrías ser mas específico con tú respuesta, por favor, si nos puedes ayudar. Tambien busco esta información.

Gracias


----------



## sagueso

Hola.
Deberían especificar el lenguaje en el que quieren leer el puerto, yo lo he probado desde visual C y turbo C pero en versiones de Windows inferiores a XP.

Conosco a alguien que lo hizo en Visual basic en XP.

El procedimiento, sin importar el lenguaje, debe ser similar:

Primero hay que considerar que los puertos paralelos pueden trabajr en varios modos, segun la versión de la bios del computador.  Eso es lo que se debe verificar en primer lugar.

Se debe buscar en el setup de la bios lo referente al puerto paralelo o LPT, desde alli se configura el puerto paralelo. Entre los modos posibles estan: como salida, entrada o bidireccional. Estos modos bienen inidicados por unas siglas como SSP,ECP, EPP,..... las cuales se refieren a la versión del puerto y al modo en que puede trabajar. Hay que seleccionar los modos ECP, ECP+xxxx o bidireccional.

Esta selección unicamente garantiza que el puerto puede ser configurado para leer datos pero aún no esta configurado como entrada. esto se hace desde el lenguaje de programación en el que se va a relaziar la apliación.

Para el manejo del puerto paralelo se consideran 3 tipos de registros: el de control, el de estado y el de datos. Y según el computador y el sistema operativo estos registros pueden trabajar con 8,16 o mas bits (1,2 o 3 bytes).Esto es muy importante para tener en cuenta.

Por ejemplo en los lenguajes de C hay intrucciones independientes para trabajar con registros de 1 byte (inport) o de 2 byte (inpotb).

Una vez definido el lenguaje en el que se va atrabajar, se procede a configurar el puerto como entrada. Esto se logra manipulando los bits del registro de control del puerto. Para ello se deben emplear las funciones que permiten apuntar a direcciones dentro del computador, tanto para escribir como para leer datos. por ejemplo para turbo C son outport - inport, en visual C son _outpw - _inpw.

Pero a que direcciones se apunta?
Esto es dependiendo de cada computador, aunque por lo general,el primer puerto paralelo 
(LPT1) es asignado en la dirección 378h que a su vez es la misma dirección del registro de datos, la siguiente dirección 379h pertenece al registro de estado y la siguiente 37Ah es la del registro de control. Si tiene alguna duda de la dirección del puerto de su computador, se puede verificar desde  la utilidad información del sistema en el menu accesorios de windows
en la sección recursos de hardware E/S.

Una vez definida las direcciones a las que se vincula el puerto, se debe configurar este como entrada. Se logra manipulando el bit 5 del registro de control asignandolo a 1. La manera como siempe lo hago es haciendo una operación OR entre ese registro y el valor 30h.

Despues de haber sido configurado, se puede emplear las instrucciones para leer registros apuntando a la dirección base del puerto (378h). y hay es cuando se recupera el valor que hay en los pines del puerto, este valor queda en formado byte o int según el tipo de variable en el que se guarde.


La siguiente es una función para turbo C

//Configura el puerto para entrada y retorna el dato que hay en el puerto
int entrada (void)
{
 int control, dato;
 control = inport (0x37A); // leo estado del registro de estado.
 outport (0x37A,control | 0x30); // configuro el puerto para entrada.
 dato = inport (0x378);  //lee el dato entrante
 return (dato);  // retorna el dato leido
}


o en visual C

int dato,valor;
 dato = _inpw (0x37A); // leo estado del registro de estado. 
 _outpw (0x37A,dato | 0x30); // configuro el puerto como entrada 
valor = _inpw (0x378); // leo el valor
valor &= 0x00FF;

Espero que esta información les sirva de guia en sus proyectos.


----------



## leo_programer

hola a todos!

señores, la información que muestra sagueso es muy cierta... hasta que lo trabajas en xp, por que??, ya mucho se ha hablado de eso en este foro, creo que deberian navegar mas antes de preguntar lo que ya se ha resuelto, en todo caso, no sirve en xp, por una cosa que se llama algo asi como virtualizacion de puertos, o yo no se, no importa, en todo caso, si quieren que les sirva en xp, tienen que usar un driver, o una libreria que haga eso, y yo, como ya lo he hecho en otros posts, recomiendo io.dll, que la pueden bajar, junto con todo lo que necesitan (información para trabjarla en vb, c++, o lo que sea) aqui:
http://www.geekhideout.com/iodll.shtml
me comentan cualquier cosa, si no saben como aplicarla en c++, me avisan y listo, cuidensen...


----------



## andres7_83

O usar un programa que se llama "allowio.exe"

Saludos ^^


----------



## hma

Muchisismas gracias a todos por sus respuetas, disculpen la demora para responder, lo que pasa es que estaba estudiando una larga y no muy divertida amteria de la facultad.
Les cuento que su información me sirvio muchisimo, y que gracias a esta pude lograr lo que necesitba.

en cuanto me haga un tiempito tengo pensado escribir una dll, o alguna clase en c++ que encapsule y automatice las tareas de lectura y escritura del puerto paralelo asi para los que tengan la mismas dudas que yo solo tengan que usar las funciones de esta libreria y se les simnplifique el trabajo, aunque tambien es verdad que se aprende mas haciendo un mismo las cosas.

bueno me despido diciendoles nuevamente muchas gracias a todos.
saludos mario


----------



## black23

buenas, como hago para captura datos a traves del puerto paralelo y mostrarlos en visual basic y despues llevarlos a una base de datos. o por lo menos capturalos y llevarlos a excel si alguin me puede ayudar se los agradesco. es mi tema de tesis y no se como hacerlo


----------



## solucion-electronica

Hola Black para hacerlo con Visual Basic y en windows xp debes agregar una .dll en system32 esa se llama oi.dll  , ya he trabajado en eso y solo he podido leer datos en el bus de estado del puerto paralelo, una vez leidos esos datos puedes hacer todo lo que quieras con ellos y tambien guardarlos en un archivo o en excel , cualquier cosa contactame .


----------



## Deme

Hola a todos en el foro! Necesito de su ayuda; Lo que quiero es saber como se pueden leer los 8 bits del puerto paralelo en el lenguaje "DELPHI" (objet pascal), para una aplicacion sencilla, solo nesecito leer datos pero no he encontrado la suficiente información. 
Gracias por sus sujerencias.
Atte: Su compañero Enrique.


----------



## slash

hma dijo:
			
		

> Muchisismas gracias a todos por sus respuetas, disculpen la demora para responder, lo que pasa es que estaba estudiando una larga y no muy divertida amteria de la facultad.
> Les cuento que su información me sirvio muchisimo, y que gracias a esta pude lograr lo que necesitba.
> 
> en cuanto me haga un tiempito tengo pensado escribir una dll, o alguna clase en c++ que encapsule y automatice las tareas de lectura y escritura del puerto paralelo asi para los que tengan la mismas dudas que yo solo tengan que usar las funciones de esta libreria y se les simnplifique el trabajo, aunque tambien es verdad que se aprende mas haciendo un mismo las cosas.
> 
> bueno me despido diciendoles nuevamente muchas gracias a todos.
> saludos mario


----------



## skynet2806

solucion-electronica dijo:


> Hola Black para hacerlo con Visual Basic y en windows xp debes agregar una .dll en system32 esa se llama oi.dll  , ya he trabajado en eso y solo he podido leer datos en el bus de estado del puerto paralelo, una vez leidos esos datos puedes hacer todo lo que quieras con ellos y tambien guardarlos en un archivo o en excel , cualquier cosa contactame .




disculpa, tienes el codigo fuente visual basic para leer el dato del puerto paralelo y guardarlo en excel? seria posible q me lo enviaras? skynet-28 de html....
seria de gran ayuda para un proyecto universitario.


----------



## airerik

Deme dijo:


> Hola a todos en el foro! Necesito de su ayuda; Lo que quiero es saber como se pueden leer los 8 bits del puerto paralelo en el lenguaje "DELPHI" (objet pascal), para una aplicacion sencilla, solo nesecito leer datos pero no he encontrado la suficiente información.
> Gracias por sus sujerencias.
> Atte: Su compañero Enrique.



Hola Deme; te cuento q todo lo que dice sagueso es cierto, especialmente la parte del computador y la estructura. AHora la parte de programacion varia segun cada lenguaje de programacion.

Yo he realizado varios sistemas utilizando el puerto de control como interfaz y desarrollado en delphi.

Ante ello te recomiendo q utilices la libreria inpout32.dll que es la que yo utilice
y en tu programa lo q haces referenciar a las funciones de dicha libreria



		Código:
	

implementation

{$R *.dfm}

function recibir (EndPorta: Integer): BYTE stdcall; external 'inpout32.DLL' name 'Inp32';
procedure enviar (EndPorta: Integer; Data: Word); stdcall; external 'inpout32.DLL' name 'Out32';


Luego utilizas dichas funciones para enviar y recibir datos del puerto paralelo en los registros q desees.

para usar la funcion enviar:
solo haces la llamada con su parametro

por ej. para enviar el Nro 37 (decimal) al registro de control escribes:



		Código:
	

num_enviar: Integer;

num_enviar:=37; 
enviar($37A,num_enviar); //$37A es el registro de control


Al enviar información al registro de control, seteas el 5 bit como 1 para q el registro de datos sea de entrada y como 0 para que sea de salida.

No te olvides q el registro de control tiene asignado 4 pines del puerto paralelo: pin 1, 14, 15, 16 definidos como C0, C1, C2, C3, donde todos son inversos excepto el C2. 
Esto es algo que no lo dijo sagueso. //ver configuracion de puerto paralelo.


para usar la funcion recibir:
te creas una variable de tipo integer
por  ej.  



		Código:
	

num_recibe: Integer;

num_recibe:=recibir($378); //$378 es el registro de datos


Ya con este numero en decimal, lo convierte a binario y sabras que valor recibiste por cada pin del registro de control, y lo utilizaras como mejor te parezca.

Nota: Es importante primero enviar un dato al registro de control para q tu registro de datos acute propiamente, en caso contrario puedes incluso hasta quemar tu puerto, esto especialmente si utilizaras como recepcion.

Espero haberte podido guiar.

Saludos


----------



## blasata

sagueso dijo:


> Hola.
> Deberían especificar el lenguaje en el que quieren leer el puerto, yo lo he probado desde visual C y turbo C pero en versiones de Windows inferiores a XP.
> 
> Conosco a alguien que lo hizo en Visual basic en XP.
> 
> El procedimiento, sin importar el lenguaje, debe ser similar:
> 
> Primero hay que considerar que los puertos paralelos pueden trabajr en varios modos, segun la versión de la bios del computador.  Eso es lo que se debe verificar en primer lugar.
> 
> Se debe buscar en el setup de la bios lo referente al puerto paralelo o LPT, desde alli se configura el puerto paralelo. Entre los modos posibles estan: como salida, entrada o bidireccional. Estos modos bienen inidicados por unas siglas como SSP,ECP, EPP,..... las cuales se refieren a la versión del puerto y al modo en que puede trabajar. Hay que seleccionar los modos ECP, ECP+xxxx o bidireccional.
> 
> Esta selección unicamente garantiza que el puerto puede ser configurado para leer datos pero aún no esta configurado como entrada. esto se hace desde el lenguaje de programación en el que se va a relaziar la apliación.
> 
> Para el manejo del puerto paralelo se consideran 3 tipos de registros: el de control, el de estado y el de datos. Y según el computador y el sistema operativo estos registros pueden trabajar con 8,16 o mas bits (1,2 o 3 bytes).Esto es muy importante para tener en cuenta.
> 
> Por ejemplo en los lenguajes de C hay intrucciones independientes para trabajar con registros de 1 byte (inport) o de 2 byte (inpotb).
> 
> Una vez definido el lenguaje en el que se va atrabajar, se procede a configurar el puerto como entrada. Esto se logra manipulando los bits del registro de control del puerto. Para ello se deben emplear las funciones que permiten apuntar a direcciones dentro del computador, tanto para escribir como para leer datos. por ejemplo para turbo C son outport - inport, en visual C son _outpw - _inpw.
> 
> Pero a que direcciones se apunta?
> Esto es dependiendo de cada computador, aunque por lo general,el primer puerto paralelo
> (LPT1) es asignado en la dirección 378h que a su vez es la misma dirección del registro de datos, la siguiente dirección 379h pertenece al registro de estado y la siguiente 37Ah es la del registro de control. Si tiene alguna duda de la dirección del puerto de su computador, se puede verificar desde  la utilidad información del sistema en el menu accesorios de windows
> en la sección recursos de hardware E/S.
> 
> Una vez definida las direcciones a las que se vincula el puerto, se debe configurar este como entrada. Se logra manipulando el bit 5 del registro de control asignandolo a 1. La manera como siempe lo hago es haciendo una operación OR entre ese registro y el valor 30h.
> 
> Despues de haber sido configurado, se puede emplear las instrucciones para leer registros apuntando a la dirección base del puerto (378h). y hay es cuando se recupera el valor que hay en los pines del puerto, este valor queda en formado byte o int según el tipo de variable en el que se guarde.
> 
> 
> La siguiente es una función para turbo C
> 
> //Configura el puerto para entrada y retorna el dato que hay en el puerto
> int entrada (void)
> {
> int control, dato;
> control = inport (0x37A); // leo estado del registro de estado.
> outport (0x37A,control | 0x30); // configuro el puerto para entrada.
> dato = inport (0x378);  //lee el dato entrante
> return (dato);  // retorna el dato leido
> }
> 
> 
> o en visual C
> 
> int dato,valor;
> dato = _inpw (0x37A); // leo estado del registro de estado.
> _outpw (0x37A,dato | 0x30); // configuro el puerto como entrada
> valor = _inpw (0x378); // leo el valor
> valor &= 0x00FF;
> 
> Espero que esta información les sirva de guia en sus proyectos.



perdona, no debería hacerse la OR con 20h en lugar de 30h para activar el bit C5 y así poner en alta impedancia el buffer de salida?


----------



## Meta

Hola:

Espero que es lo que buscas.

http://www.codeproject.com/KB/cs/csppleds.aspx

Saludo.


----------

