Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Durante más de medio año y sobre todo desde LatinoAmerica estoy recibiendo cantidad de solicitudes de ayuda para manejar el puerto paralelo del Ordenador y poder así activar relés que ponen en marcha cualquier tipo de artilugio eléctrico o electrónico. He sido reticente a escribir nada al respecto, pues consideraba que existen mil y una soluciones actuales tanto en HardWare como en SoftWare que permiten controlar motores, luces o cualquier tipo de mecatronica pero de forma profesional  con tecnología y medios actuales. Pensar el soluciones del tiempo de MS-DOS, me parece como menos equivocado siempre y cuando la finalidad no sea como ejercicio docente o como una forma de aprender y experimentar. Una vez entendida la declaración me complace compartir la siguiente explicación para contextualizar que encender un ‘led’ utilizando el puerto paralelo no es ningún logro, aunque sin despreciar la experiencia pueda ser divertido, teniendo en cuenta que la interacción con el sistema operativo es la que marcan los cánones a pesar de que de vez en cuando podamos hacerle un giño.  A demás no debemos olvidar que a día de hoy no todos los ordenadores incorporan la antigua especificación para el puerto paralelo.

Una de las características de la arquitectura x86 es el direccionamiento de dispositivos periféricos a través de un bus de entradas/salidas. Si nos remontamos en el tiempo, para la mayoría de los que utilizaron “Macro Assembler” o “C” en los tiempos de sistemas operativos como CP/M o MS/DOS, recordaran como nos hacíamos con el control de los dispositivos desviando los vectores de interrupción a nuestras rutinas y por supuesto comunicándonos directamente con los dispositivos a través de sus puertos mapeados en tal bus de E/S. Estamos hablando de dispositivos como el Teclado, Puerto Serie, Paralelo, Memoria, Timer, etc … ciertamente todos los dispositivos que componían la estructura básica de nuestro sistema. Por supuesto estábamos más que familiarizados con la utilización de las instrucción ‘in’ y ‘out’, ellas nos permitían enviar o recibir un byte utilizando un puerto (Mapa E/S) que conectaba directamente y permitía el intercambio de información con un periférico en concreto.

En esos tiempos los sistemas operativos estaban orientados a la ejecución mono-Usuario, Mono tarea, sin entorno grafico y con la única posibilidad de interaccionar a través de un ‘prompt’  por parte del usuario.

Con la llegada y evolución de los sistemas gráficos, multitarea, multiusuario para plataformas Intel, tuvieron que adaptarse a una arquitectura adecuada para tal cometido. Dicha arquitectura dicta las normas en las deben efectuarse las llamadas a  procedimientos, manejar las interrupciones y como no las excepciones, por citar algunas.

Dicho esquema, familiar para cualquier estudiante de informática como mecanismo de protección reconoce en forma de aros, en concreto cuatro aros concéntricos que representan cuatro niveles de privilegio del 0 al 3, la principal razón para usar ese esquema se vasa en mejorar la fiabilidad del propio sistema operativo.

Privilegios

El primer aro en el centro es utilizado por módulos de código que contienen partes vitales y criticas del sistema, por lo tanto disponen del nivel de privilegios más alto. El resto de módulos con menor nivel de privilegio solo pueden acceder al nivel superior a través de un estricto controlador llamado “puerta” o “gate”, intentar acceder a un segmento privilegiado de un nivel superior directamente o si utilizar la protección “gate” sin los suficientes permisos causara una excepción de protección general.

En nuestro entorno Intel/Windows, tuvimos la posibilidad de utilizar las instrucciones de ‘in’ ‘out’ tanto desde lenguajes como Asm, C y Basic y los sistemas operativos DOS, 95 y 98. Sin embargo con la tecnología NT, el uso de estas instrucciones por programas con privilegios de usuarios generaba la consecuente excepción en el sistema.

Cabe dejar claro que es del todo irreconciliable la mentalidad de acceder al puerto paralelo enviando un byte a la dirección de su puerto en un entorno como el nuestro. Difícilmente podemos justificar una programación orientada a controlar los dispositivos… ese tiempo ya paso y precisamente una de las tareas más eficientes que nuestro sistema operativo es capaz de llevar a cabo es ese control. No debemos perder la perspectiva que si necesitamos programar partes especificas que justifican ese nivel de privilegios, debemos utilizar las herramientas que nos facilita el fabricante del SO, tales como SDK, DDK..etc.  Es evidente que necesitamos una serie de conocimientos avanzados, para encajar nuestra pieza en todo este puzle, pero sin duda solo siguiendo esos patrones seremos capaces de construir soluciones profesionales aptas para superar las pruebas a nivel de los mercados a los que van dirigidos.

Advertencia y Aclaración.
Está claro que os facilito este articulo por vuestra insistencia, aunque debo advertiros que el mal uso del soldador con el conector de 25 al intentar realizar experimentos o utilizar inadecuadamente el puerto paralelo conectando aparatos o dispositivos inadecuados o incompatibles, puede causar averías en el equipo o en el peor de los casos daños personales, debo rechazar categóricamente cualquier responsabilidad por el uso de la información contenida, cualquier aplicación o uso derivada de la información de este artículo y su alcance es estrictamente responsabilidad del lector aunque estaré encantado de recibir vuestros comentarios.

En el caso que nos ocupa, para poder enviar o recibir un byte de puerto, necesitaremos estar dentro del anillo de ‘driver’ que nos proporcione los derechos de privilegio suficiente para realizar dicha operación. La mayoría de nosotros carecemos de los conocimientos suficientes para desarrollar un adaptador que nos permita fabricarnos nuestro propio ‘driver’ aunque podemos encontrar multitud de ejemplos en la red, existe una conocida librería llamada ‘inpout32.dll’ que viene a implementar ese ‘kernel model driver’. Podemos descargarnos esa librería desde un montón de ubicaciones, solo es necesario buscar ‘inpout32.dll DownLoad’ en la red y una vez dispongamos de ella copiarla en “\windows\system32”.

Luego solo nos restara crear un nuevo proyecto en Visual Studio e incluir nuestras referencias como sigue:

'Declaraciones para leer/ecribir un puerto E/S utilizando inpout32.dll

Public Declare Function leer Lib "inpout32.dll" Alias "Inp32" _

       (ByVal puerto As Short) As Short

Public Declare Sub escribir Lib "inpout32.dll" Alias "Out32" _

       (ByVal puerto As Short, ByVal Valor As Short)

 

Finalmente en el evento clic del botón por ejemplo:

    ' Para la prueba de los led's

    ' Conectar los led's a traves de una resistencia.

    ' La resistencia debe soldarse a la masa en las

    ' patillas del conector de (25pins) correspondientes

    ' a los pines 19,20,21,22,23,24,25 (son todos masa).

    ' El otro extremo de la resistencia lo soldaremos al

    ' negativo del led, y el positivo del mismo a las

    ' patillas 2,3,4,5,6,7,8,9 que corresponden a la salida

    ' del registro de datos del puerto serie.

 

    Private Sub Button1_Click() Handles Button1.Click

        Static OnOff As Boolean = False

        'el puerto &h378 corresponde a la direccion

        'del registro 'data' del LPT1:

        If OnOff Then

            'Apagar todos los led's

            escribir(&H378, &H0)

        Else

            'Encender todos los led's

            escribir(&H378, &HFF)

        End If

        OnOff = Not OnOff

    End Sub

 

Luego para leer el estado de las líneas del registro de datos:

    Private Sub Button2_Click() Handles Button2.Click

        MessageBox.Show(leer(&H378))

    End Sub

 Saludos,
Pep Lluis,

Comments

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Wednesday, March 04, 2009 12:23 PM by Jnathan

Hola Pep Lluis

Esta super..^_^...Estoy desarrollando una aplicacion donde necesito un voltaje para activar un circuito...Necesito que me ayudes en saber cual es voltaje de salida del LPT... Gracias por tu respuesta

Salu2,

Solorzano Jonathan

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Friday, March 06, 2009 5:52 AM by peplluis

+5V Dc

:-)

Saludos,

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Saturday, March 07, 2009 12:00 PM by Jonathan

Hola Pep Lluis

Gracias por tu pronta respuesta. Necesito nuevamente tu ayuda. Empese a trabajar en el proyecto, construi un circuito con los led y resistencia, luego lo conecte al puerto LPT y copie tu codigo y lo pegue. Mi aplicacion contiene un form, 2 botones, y la libreria llamada ‘inpout32.dll’ ubicada en “\windows\system32”. Aqui biene el problema =(, cuando lo probe y pulse el boton1  Mostro el siguiente mensaje:

No se controlo SEHException

Un componente externo produjo una excepcion

Pasa lo mismo con el boton2. Ademas al conectar  el circuito con el puerto LPT se enciende todos los leds, ¿Es normal esto?... Gracias por responder...

Salu2,

Solorzano Jonathan

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Sunday, March 08, 2009 11:49 AM by peplluis

Hola Jonathan,

Este ejemplo se hizo usando Visual Basic 9.0 en un sistema con Vista ambos con SP1. Para entender la excepcion deberias incluir un Try... Catch, y leer el texto de ex.message, de esa forma nos indicara que esta fallando.

Saludos,

Pep Lluis,

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Tuesday, March 10, 2009 12:31 PM by washi

hola a todos, si bien ustd conectan directamente un led con una resistencia ( de preferencia 330 ohm) , hay que tener algo en cuenta la proteccion del mismo puerto asi como de la misma pc, es necesario si o si (solo en el caso de enviar y recibir ) el uso obligatorio de un buffer de proteccion (como el ttl 74ls2455) ideal para estas aplicaciones , asi protehemos a la pc y a nuistro circuito externo.

lo digo por que hice muchos proyectos con el puerto serial pero en c++, lo cual no difiere en lenguajes superiores e inclusive le manejo de dtos es mas sencillo. si desean alguna ayuda dejo mi correo.

washi_w_z_r@hotmail.com

saludos

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Saturday, April 18, 2009 4:54 PM by LSC: Paul Eden Lara Gastelum

que tal, muy buen articulo, me puse a trabajar sobre el circuito  y me marco el mismo error , quise registrar la dll en vb 2003 y no se dejo, me marco que no podia cargarse, por lo que me busque otra version de la dll hasta que funciono.

prueben con esta versión:

logix4u.net/.../XP.html

saludos y espero que les sea de la misma utilidad como este articulo lo fue para mi.

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Thursday, May 14, 2009 5:30 PM by juan

como controlo 4 display desde el ouerto paralelo con visual o otro lenguage de programacion

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Wednesday, May 20, 2009 9:17 AM by peplluis

Aqui tienes informacion sobre el puerto paralelo :

es.wikipedia.org/.../IEEE_1284

Aunque no fue diseñedo para activar/desactivar dispositivos. Para seguir alguna de las pistas puede ver estos enlaces :

support.microsoft.com/.../q154078

www.doc.ic.ac.uk/.../par

Saludos,

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Monday, May 25, 2009 10:48 AM by Ruben

Hola que tal, tengo una duda respecto al programa, el programa envia un mensage de exeption cuando se pulsa sobre el boton1 y 2

La forma para tratar las exepciones son con Try Cath pero no le entiendo nada al mensage que manda el mensage de error, que puedo hacer?

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Wednesday, May 27, 2009 5:35 AM by peplluis

Hola Ruben,

Para poder ayudarte deberias indicarme el texto del mensage en la excepcion.

Espero tus noticias,

Pep Lluis,

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Monday, June 15, 2009 10:38 AM by Fausto

Hola estoy relizando un proyecto para controlar una bombilla pero estoy probando unas cosillas, conecte un led directamente al cable del puerto lpt y cuando lo conecto al PC se enciende y no se apaga cuando le envio la señal.

Es normal q se encienda desde que lo conecto??

porque no se apaga??

Gracias de ante mano por su ayuda...

Rep. Dom.

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Tuesday, June 16, 2009 2:37 AM by peplluis

Siguiendo el ejemplo anterior deberia encenderse/apagarse... aqui tienes un enlace del esquema para poder realizar la prueba :

msmvps.com/.../6862.Paralelo.gif

Saludos,

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Thursday, June 18, 2009 11:01 PM by Fausto

Gracias, pero tengo otro problem, este es con la aplicacion, uso Visual Basic 2005 Express y cuando corro la aplicacion bien,pero cuando invoco la funcion para escribirle un valor me arroja el sigueinte error:

Titulo:

No se Control MarshalDirectiveException

Texto:

Restricción PInvoke: no se pueden devolver variantes.

Ventana de Inmediato:

Excepción del tipo 'System.Runtime.InteropServices.MarshalDirectiveException' en LPT Send v1.0.exe

Gracias de antemano.

Rep. Dom.

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Friday, June 19, 2009 9:22 AM by peplluis

Fausto,

Es dificil predecir que esta fallando, sin conocer que sistema operativo y que codigo estas rodando.

Si quieres puedes mandarme mas informacion a traves de la opcion de [Contact] y vemos que podemos hacer.

Saludos,

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Sunday, June 21, 2009 10:11 PM by Fausto

Hola peplluis

ayer te envie informacion acerca del tema que me pediste, no se si ya lo reciviste. aqui esta mi e-mail otra vez por si estava mal.

me avisas si ya lo reciviste.

Gracias por todo.

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Monday, June 22, 2009 10:58 AM by peplluis

Ok,

Contestado!

Saludos,

Pep Lluis,

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Tuesday, July 21, 2009 8:27 AM by José Cueto

Hola a todos! les comento que esoty realizando un proyecto utilizando visual basic 6 y he conseguido programar la hora de encendido y apagado de 8 focos, el plan es tener acceso remoto a la aplicación e instalarlo directamente en la casa pero tengo problemas para recibir datos por el puerto:

-A partir de que voltaje reconoce?

-Tiene que ser 5v exactos?hay medios del proteccion?

-Con librerias io.dll es suficiente?

-Como se leen los valores en la entrada?

Porfavor, cualquier ayuda sería de gran utilidad.

Saludos,

José.

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Wednesday, July 22, 2009 12:53 AM by GACH

el error es Un componente externo produjo una excepción como lo soluciono es muy urgente Gracias

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Thursday, October 15, 2009 2:44 PM by wpablow

A ver si me pueden ayudar, como sería el código para prender los led por separado no todos juntos.

otra cosa que necesito saber es como puedo hacer para que con esos 5v habilitar el paso de corriente eléctrica?

quiero prender diferenes electrodomesticos de mi casa con código .NET

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Tuesday, November 10, 2009 8:32 AM by Ibarra

'Declaraciones para leer/ecribir un puerto E/S

este ejercicio lo tendras en Lenguaje C, lo necesito gracias.

 

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Tuesday, November 17, 2009 1:29 AM by peplluis

Hola Ibarra,

Lamentablemente no, aunque si lo vas a trabajar en C... puedes utilizar los pragmas #_Asm y lanzar directamente el Out al puerto 378.

Saludos,

Pep Lluis,

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Wednesday, November 25, 2009 12:02 PM by Ifvel

Hola, soy nueva en esto del uso del pueto paralelo, mi computadora no cuenta con este puerto por lo que instale una tarjeta externa para puerto paralelo la cual me la detecto como lpt3, estoy haciendo un programa en el cual solo necesito mandar una salida y mando en metodo salir (EC00, 255) con esa información, el EC00 debido a que esa dirección me aparece al buscar la direccion del lpt3 y el 255 para mandar la salida. Al correrlo me manda un mensaje de: Un componente externo inicio una excepcion.

No se como solucionar este problema si me pueden ayudar se los agradeceria mucho, estoy trabajanco con c# vs2003. Gracias =)

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Thursday, November 26, 2009 4:34 PM by peplluis

Hola Ifvel,

Entiendo que estas utilizando Inpout32?... que excepcion te esta mandando?

Espero tus noticias, o contacto a traves de la opcion [Contact] de esta pagina (Margen Izquierdo en la parte superios)

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Friday, November 27, 2009 10:33 AM by Ifvel

Hola! segui buscando en la web y probe con distintas versiones de dll que encontre, y al parecer era eso, al final de cuentas funciono correctamente =D la verdad no supe ni con cual inpout32 fué =S pero logré que funcionara.. Muchas gracias de igual manera =D

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Wednesday, December 02, 2009 9:50 PM by jorge

hola queria saber como prender 2 focos al mismo tiempo , ya que estoy haciendo un semaforo con 2 caras, pero solo puedo prender una cara, mientra sk la otra no lo hace

# re: Acceso al puerto paralelo LPT – Algo Más que encender un LED o Imprimir un DOC

Thursday, December 03, 2009 1:58 AM by peplluis

Hola Jorge,

Creo que este otro ejemplo puede servirte para aprender sobre el uso de ajustar a 0/1 un bit determinado dentro de un byte.

msmvps.com/.../flag-attribute-for-enum-s.aspx

Saludos,

Pep Lluis,

Leave a Comment

(required) 
(required) 
(optional)
(required)