jueves, 15 de mayo de 2008

Puerto paralelo y C#

¿Como manejar el puerto paralelo desde C#?

Bueno es una pregunta que ya me han hecho mucho y he decidido explicarlo en el blog.

Antes de meternos a explicar como hacerlo con C# tenemos que saber la configuración del puerto paralelo para eso podemos ir a "Administrador de dispositivos" y directamente buscar dentro de las propiedades de nuestro LPT (Que por lo regular es LPT1) en la imagen de la izquierda pueden ver donde checar la configuración del puerto. (Por razones de espacio no puedo poner la imagen ampliada, así que den un clik en la imagen para ver mejor).



Ahora que ya sabemos la dirección de nuestro puerto paralelo, podemos continuar con el siguiente paso, que es saber la configuración de los puertos del LPT1; tenemos 25 pines en el puerto paralelo, todos funcionan con señales TTL y a continuación se muestra como están configurados:
  • Puerto de salida (Puerto 888 ó hexadecimal 378) va del pin 2 hasta el 9, por este puerto podemos sacar la información que queramos mandar a un circuito desde el ordenador, para lo cual tenemos 8 bits, el de menor peso es el pin 2 y el de mayor peso es el 9 siendo así que podemos tener hasta 256 posibles combinaciones.
  • Puerto de salida (Puerto 889) son del pin 10 al 13 y 15 (como pueden darse cuenta son solo 5 pines), por este puerto podemos meter información a nuestra computadora proveniente del circuito, cabe señalar que los primeros tres bits de menor peso no existen en este puerto pero son tomados en cuenta a la hora de tener un valor en la entrada. Por ejemplo, si metemos una entrada por el pin 15 (que es el de menor peso) nuestro programa (que explicare mas adelante) lo tomara como el valor 8 en el puerto 889.
  • Puerto de E/S (Puerto 890) y son los pines 1, 14, 16 y 17 este puerto es especial para mandar datos tanto de entrada como de salida.

En la imagen siguiente se muestra el puerto paralelo, con sus puertos de entradas y salidas.Ahora que nos queda claro la configuración del puerto, podemos meternos a lo que les gusta, a programar en C#, para esto primero tenemos que tener la librería, la cual es: "inpout32.dll", esta librería tienen que colocarla en 2 direcciones, en System32 y en el lugar donde tendrán su programa .EXE compilado.
Ahora si en nuestro proyecto podemos crear la clase:

using System;
using System.Runtime.InteropServices;

namespace WindowsApplication1
{
class PortAccess {

//Llama al metodo Output de la librería dll.
[DllImport("inpout32.dll", EntryPoint = "Out32")]
public static extern void Output(int adress, int value);
//Llama al metodo Input de la librería dll
[DllImport("inpout32.dll", EntryPoint = "Inp32")]
public static extern int Input(int adress);

}
}

Ok ahora tenemos los dos métodos que nos interesan, para meter y sacar información por nuestro puerto. El metodo 'Output' maneja dos variables enteras iniciales, la cual es adress y value; 'adress' es la dirección de nuestro puerto de salida (especificada en la imagen del puerto paralelo arriba), que en nuestro caso es el 888 (decimal), debido a que tenemos 8 bits en nuestro puerto de salida es posible manejar cada pin de nuestros ocho bits de la siguiente manera:

por ejemplo, si queremos una salida en el pin 2 y 3 (b'00000011' <-- en binario así), pues exacto seria el valor 3 en decimal. Bueno no quiero extenderme mucho ahora pasamos al puerto de entrada. La entrada es un poco más complicada, ya que solo tenemos 5 pines con los cuales manejamos valores de 8 bits, ¿como es posible esto? bueno no se asusten la explicación es que no hay pines para los 3 bits de menor peso, pero bueno hay que verlo gráficamente para entenderlo:


Con el dibujo anterior ya nos damos una idea de lo que el programa puede leer de estos pin, pero hay que tener cuidado ya que el pin 11 esta 'negado', esto quiere decir que por ejemplo si nosotros metemos un 1 lógico por este pin el programa lo leería como 0 lógico y viceversa, de tal forma que si nosotros metemos la siguiente entrada: b'10001' el programa nos leerá un 8 decimal, que equivale al b'00001000' en binario.

Con esto ya podemos manejar el puerto paralelo, ejemplo la siguiente instrucción:

PortAccess.Output(888, 1); // Saca un 1 lógico por el pin 2 para verlo mejor b'00000001'

PortAccess.Output(888,255), // Pone todas la salida a 1 lógico, b'11111111'

Es cuestión de jugar con los números binarios y decimales para obtener la salida deseada.
El puerto de entrada es más fácil ya que solo lee, los datos que hay en la entrada ejemplo:

int a; //creamos una variable entera
a = PortAccess.Input(889); // Ponemos el valor de la entrada en la variable 'a'
System.Console.WriteLine("La entrada del puerto es: " + a); //muestra el valor de la entrada

Con estos ejemplos termina el mini tutorial (la verdad no quería extenderme tanto pero tenia que explicar todo lo anterior para llegar a estos ejemplos).

17 comentarios:

Links_Engel dijo...

Bueno me falto explicar mucho pero si hay dudas aki ando :p... o en la escuela jajaja...

Anónimo dijo...

Hey que tal, gracias por la explicación justo mi clase fue acerca de eso, ya que nos van a dejar un proyecto de este tipo. pero bueno, tu eres el master en esto y recurro a tu ayuda, quisiera hacer un proyecto original y bueno, usando puerto paralelo. bien, no quisiera hacer el tipico semaforo que enciende y apaga las luces, que me podrias recomendar? nos podemos poner en contacto?

Links_Engel dijo...

Saludos, bueno este mensaje lo publiqué en su tiempo para ayudar a unos compañeros de la escuela con su proyecto de fin de semestre en la cual le pidieron hacer un portón eléctrico manejado desde un ordenador por el puerto paralelo, pero hay tantas aplicaciones como imaginación tengas, así que cuando elijas tu proyecto y necesites ayuda puedes darte una vuelta por el blog.

Anónimo dijo...

Oye, pues quisiera saber si tienes algunas ideas o sugerecias de proyectos..

Anónimo dijo...

HOLA ME INTEREZA EL CODIGO PARA ENCENDER Y APAGAR UNAS LUCES ASI TIPO SEMAFORO, COMO YO NO SOY PROGRAMADOR PERO LLEVO ESTA MATERIA ME LO ENCARGARON COMO PROYECTO PORFA SI PE PUDIERAN AYUDAR...

Anónimo dijo...

muy buena guia, para quienes empezamos a programar puertos, por favor podrias ayudarme con informacion acerca del porton electrico o el semaforo, soy nuevo y tengo que presentar un proyecto de ese tipo

Fernando dijo...

Hola amigo tienes un error de escritura en el Puerto 889 lo tienes de salida, es logico al ver la imagen y ver que tienes 2 veces de salida.

gracias por la info. muy util ! !!

Sholito dijo...

interesante, YO TENGO ALGUNOS PROGRAMITAS APLICANDO EL PUERTO xd...... AHORITA ANDO ASIENDO UN CHAT CON UN DB9 Serial.... PERO no e podido ajaj AHI SI puedieras Ayudar SERIA de AGREDECIMEINTO.......

Anónimo dijo...

hola mucas grasias por la informacio me asido de mucha alluda
pero quisiera pedirte que me alludaras con un proyecto que me dejaron es de un chat entre 2 pc por medio de puertos lpt1 la verdad soy nuevo en esto de programar te agradeseria mucho la alluda mi correo es indracarlos2@msn.com

Links_Engel dijo...

Holas anónimo, la verdad últimamente he andado un poco ocupado, por cuestión de trabajo y escuela, pero si dejas tus dudas especificas aquí las sacamos adelante.

Anónimo dijo...

gracias por traducir el proyect :D

Anónimo dijo...

hola mira tengo ke aser un chat usando el puerto lpt1 en c# en forma visual i la berdad no se como aserlo tengo muchas dudas i los profes no me esplican nada todo kieren ke lo investiguemos
te agradeseria mucho si repondieras mi dudas:
como enviar datos por puerto paralelo?
como leer datos que nos envien?
como aser el cable tlp1 cuales pines devo soldar?
mi correo es indracarlos2@msn.com
te agradeseria mucho si me alludaras

Unknown dijo...

Hola quisiera saber si existe la posibilidad de utilizar las salidas del puerto de forma independiente!! es decir por ejemplo teniendo tres Checkbox cada uno para cada pin d salida:

checkbox 1 para el pin 1


checkbox 2 para el pin 2


checkbox 3 para el pin 3

y que al seleccionar por ejemplo el checkbox 1 y 3, se activen solo los pines 1 y 3.

Lo que quisiera saber es si se pueden trabajar cada pin por separado, espero m puedas ayudar, me podrias enviar tu respuesta al correo charsoto16@hotmail.com

gracias ;-)

Unknown dijo...

Hola quisiera saber si existe la posibilidad de utilizar las salidas del puerto de forma independiente!! es decir por ejemplo teniendo tres Checkbox cada uno para cada pin d salida:

checkbox 1 para el pin 1


checkbox 2 para el pin 2


checkbox 3 para el pin 3

y que al seleccionar por ejemplo el checkbox 1 y 3, se activen solo los pines 1 y 3.

Lo que quisiera saber es si se pueden trabajar cada pin por separado, espero m puedas ayudar, me podrias enviar tu respuesta al correo charsoto16@hotmail.com

gracias ;-)

eljeber dijo...

psss me sirvio de mucho en un proyecto en mi luegar de estudio

Alfredo dijo...

Me pregunto si aun haces esto... mi duda es esta, tienes un programa que por medio del c++ y el puerto paralelo, controle un semaforo, (verde, naranja, rojo, flecha verde
???????
Seria de mucha ayuda Gracias

MarioCR dijo...

Hola, oye una pregunta y este mismo dll funciona para otro puerto de una computadora, no se por ejemplo el serial y si es asi podrias explicarme un poquito, y te felicito esta muy bien hecho tu explicacion, entendi muy bien, aunque esto lo estudie hace algun tiempo me ayudo a recordar