PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
Manejo de puertos en C#.net
UNIVERSIDAD AUTÓNOMA DE TAMAULIPAS Verdad, Belleza, Probidad
F.C.A.C.S. DIVISIÓN DE ESTUDIOS DE POSGRADO
Programación Orientada a Objetos Ing. Ramón Roque Hernández, M.C. En materia de computadoras, un puerto es una forma genérica de denominar a una interfaz por la cual se pueden enviar y recibir diferentes tipos de datos. El uso de puertos permite conectar una computadora con su entorno cercano, con lo que puede interactuar con elementos externos, gracias a lo cual se ven ampliadas y potenciadas sus capacidades de operación. Aunque el USB es el tipo de puerto de uso más extendido en la industria de las computaras desde hace casi ya una década, el uso del puerto serie RS-232 con sus variantes, y en menor medida del puerto paralelo Centronics, sigue siendo MANUEL J. CHAVIRA TOVAR
valioso
en
aplicaciones
industriales
y
de
comunicación entre máquinas. En este trabajo de investigación, el puerto serie RS232 tiene un trato preponderante por ser el de uso más práctico y la implementación más directa en C#.net
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
I NTRODUCCIÓN Con cada día que pasa, confiamos más y más en las computadoras para todas las facetas de nuestras vidas en la era de la información. Todos los aspectos de nuestra vida diaria, como temas financieros, asuntos clínicos y tiempo de esparcimiento, tienen lazos con la red mundial de información, y por lo tanto, con computadoras. Para algunos, su computadora es su vida, e incluso más, su computadora les proporciona un recurso crucial de información, comunicación y organización. Una razón de que las computadoras sean capaces de realizar todas estas tareas asombrosas que nos facilitan la vida, es su habilidad de ser versátiles, poderosas y rápidas para acometer las tareas que se les asignen. La clave de la capacidad de conectividad de las computadoras está en sus puertos.
1
Puertos de la computadora Las computadoras están equipadas con varios puertos que les permiten operar y comunicarse con dispositivos periféricos intercambiables, algunos de los cuales son cruciales para que el usuario pueda operar y manipular la computadora, tal como en los casos del teclado y el ratón. Otros dispositivos sirven como capacidad externa, como los casos de la impresora y las bocinas. Incluso algunos más permiten que su computadora se conecte e interactúe con otros dispositivos, como asistentes personales digitales (PDA), teléfonos celulares y reproductores de MP3. El puerto USB es uno de los puertos más populares y más usados que viene de serie en prácticamente todas las computadoras que se fabrican hoy en día. USB significa “universal serial bus” o “bus serie universal” y es un estándar de facto tanto para computadoras basadas en Windows como en las computadoras Apple. Los puertos USB típicamente permiten hacer conexiones con dispositivos más pequeños. El puerto USB también es muy útil para las aplicaciones “plug and play” en las cuales cuando un dispositivo se conecta al puerto USB de una computadora, ésta localiza automáticamente el driver que le corresponda, reduciendo o eliminando la necesidad de un reinicio de software. Los puertos llamados Firewire fueron desarrollados por Apple y fueron muy usados hace unos cuantos años, sin embargo, Apple ha abandonado prácticamente al Firewire en favor del estándar USB 2.0, que es más aceptado, aunque todavía muchas de sus computadoras vienen de fábrica con el puerto Firewire. Los puertos paralelo son otro de tipo muy utilizado para conectar periféricos, como impresoras, a las computadoras, tienen un mayor tamaño que los puertos USB y Firewire, además tienen múltiples contactos que reciben al conector complementario en el extremo de un cable, y se atornillan al gabinete de la computadora para estar protegido contra desconexiones accidentales. Algunos otros tipos de puerto son: RCA – Aplicaciones de audio/video 1
TechFAQ. What is a computer port? Estados Unidos. 2009. http://www.tech-faq.com/computer-port.shtml
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
S-Video - Video VGA - Monitor DVI - Monitor RJ11 - Modem HDMI – Video de alta definición Ethernet - Redes PS2 – Teclado y ratón
Aplicaciones para uso de los puertos El uso de los puertos de la computadora permite al equipo de cómputo interactuar con elementos externos, para una gran variedad de aplicaciones, algunas de las cuales son: Comunicaciones Entre dos computadoras Entre una computadora y una red Telemetría e instrumentación electrónica
2
La telemetría es una tecnología que permite la medición remota de magnitudes físicas y el posterior envío de la información hacia el operador del sistema, típicamente mediante comunicación inalámbrica, aunque también se puede realizar por otros medios (teléfono, redes de ordenadores, enlace de fibra óptica, etcétera). La telemetría se utiliza en grandes sistemas, tales como las naves espaciales o las plantas químicas, debido a que facilita el monitoreo automático y el registro de las mediciones, así como el envío de alertas, con el fin de que el funcionamiento sea seguro y eficiente. Por ejemplo, las agencias espaciales como la NASA, la Q.K, la ESA y otras, utilizan sistemas de telemetría y de telecomando para operar con naves espaciales y satélites. Se utiliza también en infinidad de campos, tales como la exploración científica con naves tripuladas o no (submarinos, aviones de reconocimiento y satélites), diversos tipos de competición (por ejemplo, Fórmula 1 y MotoGP), o la operación de modelos matemáticos destinados a dar sustento a la operación de embalses. Una aplicación muy importante de la telemetría es la perforación de pozos petroleros; ésta se utiliza para la medición con herramientas navegables MWD y LWD. Se utiliza básicamente la telemetría de pulso de lodo, que se transmite a través de la tubería de perforación por medio del lodo de perforación. Comunicación con periféricos
3
Dispositivos de entrada: Teclado
2 3
Wikipedia en Español. Telemetría. Estados Unidos. 2009. http://es.wikipedia.org/wiki/Telemetr%C3%ADa Wikipedia en Español. Entrada/Salida. Estados Unidos. 2009. http://es.wikipedia.org/wiki/Entrada/salida
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
Ratón Joystick Lápiz óptico Micrófono Webcam Escáner Escáner de código de barras Pantalla táctil Lector biométrico (huellas digitales, iris, palma, etc.) Dispositivos de salida: Monitor Altavoz Auriculares Impresora Plotter Proyector Dispositivos bidireccionales (entrada y salida): Unidades de almacenamiento CD DVD Módem Fax USB Dispositivos para acceso a redes inalámbricas WiFi y WiMax
Definiciones importantes Telecomunicación
4
La telecomunicación o comunicación a distancia, es una técnica consistente en transmitir un mensaje desde un punto a otro, normalmente con el atributo típico de ser bidireccional. El término telecomunicación cubre todas las formas de comunicación a distancia, incluyendo radio, telegrafía, televisión, telefonía, transmisión de datos e interconexión de ordenadores a nivel de enlace. El Día Mundial de la Telecomunicación se celebra el 17 de mayo. Telecomunicaciones abarca toda transmisión, emisión o recepción de signos, señales, datos, imágenes, voz, sonidos o información de cualquier naturaleza que se efectúa a través de cables, radioelectricidad, medios ópticos, físicos u otros sistemas electromagnéticos.
4
Wikipedia en Español. Telecomunicación. Estados Unidos. 2009. http://es.wikipedia.org/wiki/Telecomunicaci%C3%B3n
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
Estándar En términos de comunicaciones, estándar es una especificación que regula la realización de ciertos procesos o la fabricación de componentes para garantizar la interoperabilidad de equipos5, es decir, se refiere a las normas y especificaciones físicas y eléctricas que rigen el comportamiento de un determinado elemento. En el caso de los estándares de comunicación serie RS-232, RS-422 y RS-485, las diferencias entre ellos son los niveles de voltaje que manejan y utilizan para señalizar marca o espacio, el tipo de cables que se debe utilizar y su configuración física (cables simples o par trenzado), las dimensiones mecánicas, etc. No se debe confundir este término con el de protocolo, porque estándar se limita a definir las características físicas, mecánicas y operativas del medio físico y eléctrico de comunicación. Protocolo
6
En el campo de las telecomunicaciones, un protocolo de comunicaciones es el conjunto de reglas normalizadas para la representación, señalización, autenticación y detección de errores necesario para enviar información a través de un canal de comunicación. Los protocolos de comunicación para la comunicación digital entre computadoras tienen características destinadas a asegurar un intercambio de datos confiable a través de un canal de comunicación imperfecto. Los protocolos de comunicación siguen ciertas reglas para que el sistema funcione apropiadamente. Los protocolos implantados en sistemas de comunicación de amplio impacto, suelen estandarizarse, debido a que la comunicación e intercambio de información (datos) es un factor fundamental en numerosos sistemas, y para asegurar tal comunicación se vuelve necesario copiar el diseño y funcionamiento a partir del ejemplo pre-existente, lo cual ocurre tanto de manera informal como deliberada. Existen consorcios empresariales, que tienen como propósito precisamente el de proponer recomendaciones de estándares que se deben respetar para asegurar la interoperabilidad de los productos. La especificación de un protocolo incluye: Sintaxis: especifica cómo son y cómo se construyen los mensajes de intercambio de información. Semántica: especifica el significado de cada comando o respuesta del protocolo respecto a sus parámetros/datos. Procedimientos de uso de esos mensajes: es lo que hay que programar realmente (los errores, como tratarlos).
5 6
Wikipedia en Español. Estándar. Estados Unidos. 2009. http://es.wikipedia.org/wiki/Est%C3%A1ndar Wikipedia en Español. Protocolo de comunicaciones. Estados Unidos. 2009. http://es.wikipedia.org/wiki/Protocolo_de_comunicaci% C3%B3n
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
Implementación de una aplicación con uso de puertos Cuando se requiere crear una aplicación que comunique la computadora con elementos externos, es necesario apegarse al siguiente procedimiento: 1. Determinar el tipo de estándar que se debe emplear para interactuar con el dispositivo externo: RS-232, RS-422, RS-485 o acceso a líneas de entrada salida en paralelo. 2. Determinar si es necesario utilizar un adaptador de USB a RS-232 o USB a Paralelo, en el caso de que la computadora no cuente con un puerto RS-232 instalado de fábrica. Tomar en cuenta que algunos dispositivos USB incluyen un driver que instala un puerto serie virtual asociado con el dispositivo USB, con lo que no se requiere emplear adaptadores físicos. 3. Determinar si es necesario un adaptador entre estándares serie: RS-232 a RS-422, RS-232 a RS-485. 4. Determinar el protocolo que se debe implementar para interactuar con el dispositivo externo. 5. Obtener el protocolo. 6. Crear la aplicación en Visual C# a. Declarar el nombre de espacio System.IO.Ports, que hace posible leer y escribir en un puerto serie. b. Creación de un objeto tipo SerialPort. c.
Configurar el puerto: número de COM, baud rate, bits de inicio y paro, bits de datos, paridad y control de flujo.
d. Escribir la función de escritura. e. Escribir la función de lectura. f.
Implementar la lógica de la aplicación.
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
E L P UERTO USB El Universal Serial Bus (bus universal en serie), abreviado comúnmente USB, es un puerto que sirve para conectar periféricos a una computadora. Fue creado en 1996 por siete empresas: IBM, Intel, Northern Telecom, Compaq, Microsoft, Digital Equipment Corporation y NEC.
7
El diseño del USB buscaba eliminar la necesidad de adquirir tarjetas separadas para poner en los puertos bus ISA o PCI, y mejorar las capacidades plug-and-play permitiendo a esos dispositivos ser conectados o desconectados al sistema sin necesidad de reiniciar. Sin embargo, los buses PCI o PCIe funcionan mucho mejor en aplicaciones en las que se necesita un ancho de banda mayor para grandes transferencias de datos o una latencia baja. De igual forma sucede si la aplicación requiere de robustez industrial. En contraparte, el bus USB tiene la ventaja significativa de la sencillez de incorporación de nuevos dispositivos, ya que cuando se conecta un nuevo dispositivo, el servidor lo enumera y agrega el software necesario para que pueda funcionar. El USB por sí solo no funciona para conectar los periféricos, porque requiere ser dirigido por el drive central, con lo que se pueden incorporar aplicaciones como ratones, teclados, escáneres, cámaras digitales, teléfonos móviles, reproductores multimedia, impresoras, discos duros externos entre otros ejemplos, tarjetas de sonido, sistemas de adquisición de datos y componentes de red. Para dispositivos multimedia como escáneres y cámaras digitales, el USB se ha convertido en el método estándar de conexión. Para impresoras, el USB ha crecido tanto en popularidad que ha desplazado a un segundo plano a los puertos paralelos porque el USB hace mucho más sencillo el poder agregar más de una impresora a una computadora personal. Algunos dispositivos requieren una potencia mínima, así que se pueden conectar varios sin necesitar fuentes de alimentación extra. La gran mayoría de los concentradores incluyen fuentes de alimentación que brindan energía a los dispositivos conectados a ellos, pero algunos dispositivos consumen tanta energía que necesitan su propia fuente de alimentación. Los concentradores con fuente de alimentación pueden proporcionarle corriente eléctrica a otros dispositivos sin quitarle corriente al resto de la conexión (dentro de ciertos límites). En el caso de los discos duros, es poco probable que el USB reemplace completamente a los buses (el ATA (IDE) y el SCSI), pues el USB tiene un rendimiento más lento que esos otros estándares. Sin embargo, el USB tiene una importante ventaja en su habilidad de poder instalar y desinstalar dispositivos sin tener que abrir el sistema, lo cual es útil para dispositivos de almacenamiento externo. Hoy en día, una gran parte de los fabricantes ofrece dispositivos USB portátiles que ofrecen un rendimiento casi indistinguible en comparación con los ATA (IDE). Por el contrario, el nuevo estándar Serial ATA permite tasas de transferencia de hasta aproximadamente 150/300 MB por segundo, y existe también la posibilidad de extracción sin interrumpir la operación e incluso una especificación para discos externos llamada eSATA.
7
Wikipedia en Español. Universal Serial Bus. Estados Unidos. 2009. http://es.wikipedia.org/wiki/USB
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
El USB casi ha reemplazado completamente a la interfaz PS/2 en los teclados y ratones, hasta el punto de que un amplio número de tarjetas madre (motherboards) modernas carecen de dicho puerto o cuentan solamente con uno, que funciona con ambos periféricos.
Características de transmisión Los dispositivos USB se clasifican en cuatro tipos según su velocidad de transferencia de datos: Baja velocidad (1.0). Tasa de transferencia nominal de 1.5 Mbps (192 KB/s) o mayor. Se utiliza principalmente en dispositivos de interfaz humana (Human interface device, en inglés) como teclados, ratones, hornos microondas y artículos del hogar. Velocidad completa (1.1). Tasa de transferencia nominal de hasta 12 Mbps (1.5 MB/s), aunque fuentes independientes sugieren realizar nuevas mediciones. Este tipo fue el más rápido antes de que surgiera la especificación USB 2.0; muchos dispositivos fabricados actualmente funcionan a esta velocidad. Estos dispositivos dividen el ancho de banda de la conexión USB entre ellos, basados en un algoritmo de impedancias LIFO. Alta velocidad (2.0). Tasa de transferencia nominal de hasta 480 Mbps (60 MB/s), que por lo general funciona hasta 125Mbps (16MB/s). Súper alta velocidad (3.0): Tiene una tasa nominal de transferencia de hasta 4.8 Gbps (600 MB/s) y actualmente se encuentra en fase experimental. Esta especificación será diez veces más veloz que la anterior 2.0 y se espera que salga al mercado a mediados de 2009 aunque aún no hay hardware disponible que lo soporte. La velocidad del bus es diez veces más rápida que la del USB 2.0, debido a que han incluido 5 conectores extra, desechando el conector de fibra óptica propuesto inicialmente, pero manteniendo la compatibilidad con los estándares anteriores. Se espera que los productos fabricados con esta tecnología lleguen al consumidor entre 2009 y 2015. Las señales del USB se transmiten por medio de un cable de par trenzado con una impedancia característica de 90 Ω ± 15%, cuyos hilos se denominan D+ y D-. Estos, colectivamente, utilizan señalización diferencial en full dúplex para combatir los efectos del ruido electromagnético en enlaces largos. D+ y D- operan en conjunto como conexión única. Los niveles de transmisión de la señal varían de 0 a 0.3 V para nivel bajo (cero lógico) y de 2.8 a 3.6 V para nivel alto (uno lógico) en las versiones 1.0 y 1.1, y en ±400 mV en el USB 2.0 de alta velocidad.
Cable de Par Trenzado
En las primeras versiones los alambres de los cables no se conectan a tierra, pero en el modo de alta velocidad se tiene una terminación de 45 Ω a tierra o un diferencial de 90 Ω para acoplar la impedancia del cable. Este puerto sólo admite la conexión de dispositivos de bajo consumo, es decir, que tengan un consumo máximo de 100 mA por cada puerto; sin embargo, en caso de que estuviese conectado un dispositivo que permite 4 puertos por cada salida USB (extensiones de
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
máximo 4 puertos), entonces la energía del USB se asignará en unidades de 100 mA hasta un máximo de 500 mA por puerto.
Compatibilidad y conectores El estándar USB especifica características eléctricas y mecánicas de los conectores, pero a diferencia de otros estándares también define tamaños para el área alrededor del conector de un dispositivo, buscando evitar el bloqueo de un puerto adyacente por el dispositivo en cuestión. Las especificaciones USB 1.0, 1.1 y 2.0 definen dos tipos de conectores para conectar dispositivos al dispositivo servidor: A y B. Sin embargo, la capa mecánica ha cambiado en algunos conectores. Por ejemplo, el IBM UltraPort es un conector USB privado localizado en la parte superior del LCD de las computadoras portátiles de IBM. Utiliza un conector mecánico diferente mientras mantiene las señales y protocolos característicos del USB. Otros fabricantes de artículos pequeños han desarrollado también sus medios de conexión pequeños, y ha aparecido una gran variedad de ellos, algunos de baja calidad. Una extensión del USB llamada "USB-On-The-Go" (sobre la marcha) permite a un puerto actuar como servidor o como dispositivo - esto se determina por qué lado del cable está conectado al aparato. Incluso después de que el cable está conectado y las unidades se están comunicando, ambas unidades pueden "intercambiar de papel" bajo el control de un programa. Esta facilidad está específicamente diseñada para dispositivos como PDA, donde el enlace USB podría conectarse a un PC como un dispositivo, y conectarse como servidor a un teclado o ratón. El "USB-On-The-Go" también ha diseñado 2 conectores pequeños, el mini-A y el mini-B, así que esto debería detener la proliferación de conectores miniaturizados de entrada. La asignación de funciones de cada punto de conexión (pin) se detalla a continuación: CONECTOR USB ESTÁNDAR
CONECTOR USB MINIPLUG/MICROPLUG
Pin
Nomb re
Color del cable
Descripción
Pin
Nombre
Color del cable
Descripción
1
VCC
Rojo
+5v
1
VCC
Rojo
+5v
2
D−
Blanco
Data –
2
D−
Blanco
Data –
3
D+
Verde
Data +
3
D+
Verde
Data +
4
GND
Negro
Tierra
4
ID
Ninguno
Permite distinguir Micro-A y Micro-B
5
GND
Negro
Tierra 8
La especificación del USB incluye los siguientes tipos de conexión mecánica :
Conectores Macho de 4 puntos (Usados en los periféricos)
8
Conectores Hembra de 4 puntos (Usados en el controlador)
Pinouts.Ru. USB Pinout. Estados Unidos. 2005. http://pinouts.ru/Slots/USB_pinout.shtml
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
E L P UERTO S ERIE Un puerto serie es una interfaz de comunicaciones de datos digitales, frecuentemente utilizado por computadoras y periféricos, en donde la información es transmitida bit a bit enviando un solo bit a la vez, a diferencia del puerto paralelo que envía varios bits simultáneamente. La comparación entre la transmisión en serie y en paralelo se puede explicar con analogía con las carreteras. Una carretera tradicional de un sólo carril por sentido sería como la transmisión en serie y una autopista con varios carriles por sentido sería la transmisión en paralelo, siendo los coches los bits.
9
En informática, un puerto serie es una interfaz física de comunicación en serie a través de la cual se transfiere información mandando o recibiendo un bit. A lo largo de la mayor parte de la historia de las computadoras, la transferencia de datos a través de los puertos serie ha sido generalizada. Se ha usado y sigue usándose para conectar las computadoras a dispositivos como terminales o módems. Los ratones, teclados, y otros periféricos también se conectaban de esta forma. Mientras que otras interfaces como Ethernet, FireWire, y USB mandaban datos como un flujo en serie, el término "puerto serie" normalmente identifica el hardware más o menos conforme al estándar RS-232, diseñado para interactuar con un módem o con un dispositivo de comunicación similar. En muchos periféricos la interfaz USB ha reemplazado al puerto serie; en el año 2009 la mayor parte de las computadoras están conectadas a dispositivos a través de USB, y con frecuencia ni siquiera tienen un puerto serie, el cual se omite para reducir costos de manufactura de los equipos y se considera que es un puerto heredado. Sin embargo, los puertos de serie todavía se encuentran en sistemas de automatización industrial y algunos productos industriales y de consumo. Los dispositivos de redes (como ruteadores y conmutadores) frecuentemente tienen puertos serie para su configuración, en donde se usan por ser sencillos, baratos y porque permiten la interoperabilidad entre dispositivos. La desventaja es que configurar conexiones de serie puede requerir el conocimiento de un experto y el uso de comandos complejos.
Puerto Serie Asíncrono El puerto serie RS-232 (también conocido como COM) es del tipo asíncrono; utiliza cableado simple desde 3 hasta 25 hilos y conecta computadoras o microcontroladores a todo tipo de periféricos, como terminales, impresoras, módems y ratones. La interfaz entre el RS-232 y el microprocesador generalmente se realiza mediante una UART 8250 (computadoras de 8 y 16 bits, PC XT) o 16550 (IBM Personal Computer/AT y posteriores). El RS-232 original tenía un conector tipo DB-25, sin embargo la mayoría de dichos pines no se utilizaban, por lo que IBM estandarizó con su gama IBM Personal System/2 el uso del conector DE9 (ya introducido en el AT) mayoritariamente usado en las computadoras comerciales, aunque excepto los ratones, el resto de los periféricos presentaban el DB-25. En Europa la norma RS-422, 9
Wikipedia en Español. Puerto serie. Estados Unidos. 2009. http://es.wikipedia.org/wiki/Puerto_serie
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
similar al RS-232, es un estándar utilizado en el ámbito industrial. Un mismo puerto serie puede utilizar estándares de comunicación diferentes al RS-232 en aplicaciones de uso industrial, en cuyo caso se utilizan convertidores de niveles de señales para adaptarse a la conexión con RS-422 o RS-485. Estos tres tipos de estándar de comunicación más utilizados (RS-232, RS-422 y RS-485), se describen párrafos adelante en esta misma sección.
Tipos de Comunicación Serie Existen tres clasificaciones de la comunicación serie, de acuerdo con la forma en que fluye la información entre los dos extremos del lazo, mismos que se describen a continuación. Simplex En este caso el transmisor y el receptor están perfectamente definidos y la comunicación es unidireccional. Este tipo de comunicaciones se emplean usualmente en redes de radiodifusión, donde los receptores no necesitan enviar ningún tipo de dato al transmisor. Duplex, half duplex o semi-duplex En este caso ambos extremos del sistema de comunicación cumplen funciones de transmisor y receptor y los datos se desplazan en ambos sentidos pero no simultáneamente. Este tipo de comunicación se utiliza habitualmente en la interacción entre terminales y un computador central. Full Duplex El sistema es similar al duplex, pero los datos se desplazan en ambos sentidos simultáneamente. Para ello ambos transmisores poseen diferentes frecuencias de transmisión o dos caminos de comunicación separados, mientras que la comunicación semi-duplex necesita normalmente uno solo. Para el intercambio de datos entre computadores este tipo de comunicaciones son más eficientes que las transmisiones semi-duplex.
El Estándar RS-232 RS-232 (también conocido como Electronic Industries Alliance RS-232C) es una interfaz que designa una norma para el intercambio serie de datos binarios entre un DTE (Equipo terminal de datos) y un DCE (Data Communication Equipment, Equipo de Comunicación de datos), aunque existen otras en las que también se utiliza la interfaz RS-232.
10
En particular, existen ocasiones en que interesa conectar otro tipo de equipos, como computadoras. Evidentemente, en el caso de interconexión entre los mismos, se requerirá la conexión de un DTE (Data Terminal Equipment) con otro DTE, para lo que se utiliza una conexión entre ellos sin usar modem, por lo que se le conoce como null modem ó modem nulo. El RS-232 consiste en un conector tipo DB-25 (de 25 puntos), aunque es normal encontrar la versión de 9 puntos
(DE-9), más barata y más extendida; este estándar está diseñado para
permitir la comunicación entre dos equipos y no para un bus o red de dispositivos.
10
Wikipedia en Español. RS-232. Estados Unidos. 2009. http://es.wikipedia.org/wiki/RS232
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
Conexiones en el DTE La disposición de los conectores DB9 y DB25 en el panel de la computadora es:
DB-9 Macho
DB-25 Macho 11
En la siguiente tabla se indican las señales RS-232 más comunes según los pines asignados : DB9
DB25
Símbolo
Nombre
Dirección
Descripción
3
2
TxD
Transmit Data
Transmite bytes desde la PC
2
3
RxD
Receive Data
Recibe bytes en la PC Control de flujo RTS/CTS
7
4
RTS
Request To Send
8
5
CTS
Clear To Send
Control de Flujo RTS/CTS
6
6
DSR
Data Set Ready
Estoy listo para comunicarme
4
20
DTR
Data Terminal Ready
Estoy listo para comunicarme
1
8
DCD
Data Carrier Detect
Modem conectado a otra terminal
9
22
RI
Ring Indicator
Indicador de marcación de la línea telefónica
5
7
SG
Signal Ground Nota: La línea DCD en ocasiones se etiqueta como CD
Construcción física La interfaz RS-232 está diseñada para distancias cortas, de hasta 15 metros según la norma, y para velocidades de comunicación bajas, de no más de 20 Kilobytes/segundo. A pesar de ello, muchas veces se utiliza a mayores velocidades con un resultado aceptable. La interfaz puede trabajar en comunicación asíncrona o síncrona y tipos de canal simplex, half duplex o full duplex. En un canal simplex los datos siempre viajarán en una dirección, por ejemplo desde DCE a DTE. En un canal half duplex, los datos pueden viajar en una u otra dirección, pero sólo durante un determinado periodo de tiempo; luego la línea debe ser conmutada antes que los datos puedan viajar en la otra dirección. En un canal full duplex, los datos pueden viajar en ambos sentidos simultáneamente. Las líneas de handshaking de la RS-232 se usan para resolver los problemas asociados con este modo de operación, tal como en qué dirección los datos deben viajar en un instante determinado. Si un dispositivo de los que están conectados a una interfaz RS-232 procesa los datos a una velocidad menor de la que los recibe deben de conectarse las líneas handshaking que permiten realizar un control de flujo tal que al dispositivo más lento le dé el tiempo necesario de procesar la información. Las líneas de "hand shaking" que permiten hacer este control de flujo son las líneas RTS y CTS. Los diseñadores del estándar no concibieron estas líneas para que funcionen de este modo, pero dada su utilidad en cada interfaz posterior se incluye este modo de uso.
11
AGG Software. Serial (RS232) port interface pinout and signals. Estados Unidos. 2007. http://www.aggsoft.com/rs232-pinout-cable/ pinout-and-signal.htm
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
El Estándar RS-422 Las interfaces con el estándar RS-422 se desarrollaron para transmisiones de datos en serie a alta velocidad y a grandes distancias, encontrando una amplia aplicación en el sector industrial. Además este estándar permite la conexión de hasta 10 receptores con un transmisor RS-422 dentro de un mismo bus serie.
12
Conexiones En el estándar RS-422 no se establece ninguna especificación mecánica sino que se remite solamente a la RS449, que describe una conexión SUB-D de 37 puntos. Por motivos de espacio y costo no se ha popularizado esta forma de conexión mecánica, pero la mayoría de las aplicaciones utilizan conexiones SUB-D en versión de 9, 15 y 25 puntos. Al no existir una designación de circuitos o puntos, cuando se hace una conexión con dispositivos RS-422 debe consultarse invariablemente la descripción de conexiones de la documentación del dispositivo. Método físico de transmisión Los datos en serie se transmiten sin relación a tierra, como diferencia de tensión entre las líneas correspondientes. Para cada señal a transmitir existe un par de conductores que se compone de una línea de señales invertida y otra no invertida. La línea invertida se caracteriza por regla general con la marca índice "A" o "-", mientras que la línea no invertida lleva "B" o "+". El receptor evalúa solamente la diferencia existente entre ambas líneas, de modo que las modalidades comunes de perturbación hasta 7V en la línea de transmisión no falsifican la señal útil. Los transmisores RS-422 dan una salida de ±2V entre las dos líneas, en condiciones de carga; mientras que los módulos de recepción reconocen el nivel de ±200mV como señal válida. La asignación tensión de diferencia al estado lógico se define del modo siguiente: A - B < -0,3V = MARK = OFF = Lógico 1 A - B > +0,3V = SPACE = ON = Lógico 0 Longitud de líneas La longitud máxima de los cables utilizados con este estándar, depende de la velocidad de transmisión que se elija y es como máximo 1,200 metros; conforme la velocidad de transmisión se incremente por encima de los 100 Kbit/s, el alcance desciende, como se ilustra en la siguiente gráfica.
Alcance de la transmisión vs Velocidad de transmisión 12
Interfaces W&T. Interfaz RS422. Inglaterra. 2005. http://www.wut.de/e-6wwww-10-apes-000.php
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
Usando el método de transmisión simétrico en combinación con cables de pares de baja capacidad y amortiguación (twisted pair) pueden realizarse conexiones muy eficaces a través de grandes distancias con velocidades de transmisión altas. El uso de un cable TP de alta calidad evita por un lado la diafonía entre las señales transmitidas y por el otro reduce la sensibilidad de la instalación de transmisión contra señales perturbadoras entremezcladas. Terminación El uso de una terminación en los extremos de cable depende por norma de la aplicación. Con velocidades de transmisión superiores a 200kBit/s o un tiempo de funcionamiento de señal en el cable de más de la mitad de tiempo Bit (en codificación NRZ), se debería emplear una terminación para suprimir la reflexión en la magnitud de la impedancia del cable. En cables por pares ésta queda por regla general entre 100 y 200 Ohmios. Particularidades Aunque determinado para grandes distancias, entre las que por regla general son inevitables desplazamientos de potencial, la norma no prescribe para las interfaces RS422 ninguna separación galvánica. Dado que los módulos receptores reaccionan sensiblemente a un desplazamiento de los potenciales de masa, es recomendable necesariamente una separación galvánica para instalaciones eficaces. En la instalación tiene que cuidarse de la polaridad correcta de los pares de cables, puesto que una polaridad falsa lleva a una inversión de las señales de datos y de Handshake.
El Estándar RS-485 Definido como un sistema en bus de transmisión multipunto diferencial, es ideal para transmitir a altas velocidades sobre largas distancias (35 Mbps hasta 10 metros y 100 Kbps en 1,200 metros) y a través de canales ruidosos, ya que reduce las señales parásitas que aparecen en los voltajes por efecto de su paso a través de la línea de transmisión. El medio físico de transmisión es un par trenzado que admite hasta 32 estaciones en 1 solo hilo, con una longitud máxima de 1,200 metros operando entre 300 y 19,200 bps y la comunicación half-duplex (semiduplex). Soporta 32 transmisiones y 32 receptores. La transmisión diferencial permite múltiples drivers dando la posibilidad de una configuración multipunto. Al tratarse de un estándar bastante abierto permite muchas y muy diferentes configuraciones y utilizaciones.
13
Especificaciones Interfaz diferencial Conexión multipunto Alimentación única de +5V Hasta 32 estaciones (ya existen interfaces que permiten conectar 128 estaciones) Velocidad máxima de 10 Mbps (a 12 metros)
13
Wikipedia en Español. RS-485. Estados Unidos. 2009. http://es.wikipedia.org/wiki/RS-485
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
Longitud máxima de alcance de 1.200 metros (a 100 Kbps) Rango de bus de -7V a +12V Aplicaciones SCSI -2 y SCSI-3 usan esta especificación para ejecutar la capa física. RS-485 se usa con frecuencia en las UARTs para comunicaciones de datos de poca velocidad en las cabinas de los aviones, en donde algunas unidades de control del pasajero lo utilizan; este estándar requiere un mínimo de cableado y puede compartirlo entre varios asientos, con lo que contribuye a reducir el peso del sistema. RS-485 se utiliza en sistemas grandes de sonido, como los conciertos de música y las producciones de teatro, se usa software especial para controlar remotamente el equipo de sonido de una computadora, es utilizado más generalmente para los micrófonos. RS-485 también se utiliza en la automatización de los edificios pues el cableado simple del bus y la longitud de cable es larga por lo que son ideales para ensamblar los dispositivos que se encuentran alejados.
Puertos Serie Modernos Uno de los defectos de los puertos serie iniciales era su lentitud en comparación con los puertos paralelos, ya que era de 19.2 kbits por segundo, sin embargo, con el paso del tiempo han aparecido diversos puertos serie de alta velocidad que los hacen muy interesantes ya que utilizan las ventajas del menor cableado y solucionan el problema de la velocidad con un mayor blindaje anti ruidos de los cables y más barato usando la técnica del par trenzado. Por ello, el puerto RS232 e incluso multitud de puertos paralelos están siendo reemplazados por nuevos puertos serie como el USB, el Firewire o el Serial ATA.
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
E L P UERTO P ARALELO Un puerto paralelo es una interfaz entre una computadora y un periférico, cuya principal característica es que los bits de datos viajan juntos, enviando un paquete de 1 byte a la vez, gracias a que se implementa un cable o una vía física para cada bit de datos formando un bus. Mediante el puerto paralelo es posible controlar también periféricos como indicadores, lámparas, motores y demás dispositivos usados en automatización.
14
El cable paralelo es el conector físico entre el puerto paralelo y el dispositivo periférico. En un puerto paralelo existe una serie de bits de control que se conectan por cables adicionales que facilitan el flujo de información bidireccional por caminos independientes. La principal diferencia de este puerto con el puerto serie, es que éste envía un bit a la vez, mientras que el paralelo envía 8 bits de datos simultáneamente, proporcionando una velocidad de transferencia significativamente mayor.
El Puerto Paralelo Centronics El puerto paralelo más conocido es el puerto de impresora que destaca por su sencillez y que transmite 8 bits a la vez. Se ha utilizado principalmente para conectar impresoras, pero también ha sido usado para programadores EPROM, escáners, interfaces de red Ethernet a 10 MB, unidades ZIP, SuperDisk y para comunicación entre dos PC (MS-DOS trajo en las versiones 5.0 ROM a 6.22 un programa para soportar esas transferencias). El puerto paralelo de las computadoras, de acuerdo a la norma Centronics, está compuesto por un bus de comunicación bidireccional de 8 bits de datos, además de un conjunto de líneas de protocolo. Las líneas de comunicación cuentan con un registro de datos retenidos, que mantiene el último valor que les fue escrito hasta que se realiza la escritura de un nuevo dato. Sus características eléctricas son: Tensión de nivel alto: 3.3 o 5 V. Tensión de nivel bajo: 0 V. Intensidad de salida máxima: 2.6 mA. Intensidad de entrada máxima: 24 mA. Los sistemas operativos basados en DOS y compatibles, gestionan las interfaces de puerto paralelo con los nombres LPT1, LPT2 y así sucesivamente. Las direcciones base de los dos primeros puertos son: LPT1 = 0x378 LPT2 = 0x278 La estructura consta de tres registros: de control, de estado y de datos. El registro de control es un bidireccional de 4 bits, con un bit de configuración que no tiene conexión al exterior, su dirección en el LPT1 es 0x37A. 14
Wikipedia en Español. Puerto paralelo. Estados Unidos. 2009. http://es.wikipedia.org/wiki/Puerto_paralelo
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
El registro de estado, se trata de un registro de entrada de información de 5 bits, su dirección en el LPT1 es 0x379. El registro de datos, se compone de 8 bits, es bidireccional. Su dirección en el LPT1 es 0x378.
Señales Eléctricas Como se diseñó originalmente, las líneas de control son usadas como control de la interfaz y señalización de establecimiento de comunicación (Hand Shaking) de la PC a la impresora. Las líneas de estado (Status) se usan para la señalización de establecimiento de conexión y como indicador de estado para cosas tales como no tener papel, indicador de ocupado y errores de la interfaz o del periférico. Las Líneas de datos son usadas para proveer la información desde la PC a la impresora, en esa única dirección. Implementaciones posteriores del puerto paralelo permiten que los datos fluyan en sentido inverso.
15
La siguiente tabla identifica cada una de esas señales y da su definición de acuerdo al Puerto Paralelo Estándar (SPP). Las señales dentro de estos grupos asignadas a bits específicos dentro de los registros hacen la interfaz de hardware/software del Puerto Paralelo. El Registro consiste en un bloque contiguo de 3 registros comenzando desde la dirección base del puerto paralelo. Estos puertos son comúnmente referidos como los puertos LPT y tienen su dirección base típicamente en 3BCh, 378h y 278h (valores hexadecimales). Implementaciones recientes que soportan modos avanzados del estándar IEEE 1284 usan entre 8 16 registros y están localizados en las direcciones de entrada y salida (I/O address) 378h o 278h o son “reubicables”, como es el caso del adaptador compatible paralelo Plug and Play. Definición de las señales del Puerto Paralelo
Data
Status
Control
Grup o
Señal
Entrada/Salida
Descripción
STROBE
C0
Salida
Indica que hay datos válidos en la línea de datos
AUTOFEED
C1
Salida
Hace que la impresora automáticamente inserte una línea por cada retorno de carro
SELECTIN
C3
Salida
Le indica a la impresora que está seleccionada
INIT
C2
Salida
Usado para reiniciar la impresora
ACK
S6
Entrada
Indica que el último carácter fue recibido
BUSY
S7
Entrada
Indica que la impresora está ocupada y no puede aceptar datos
PE
S5
Entrada
Sin papel
SELECT
S4
Entrada
Indica que la impresora está en línea
nERROR
S3
Entrada
Indica que existe una condición de error
DATA (8:1)
D0
Entrada / Salida
8 líneas de datos, en el antigua puerto paralelo estándar son sólo de salida
.. D7
15
Wikipedia en Español. IEEE 1284. Estados Unidos. 2009. http://es.wikipedia.org/wiki/IEEE_1284
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
El uso de las señales descritas anteriormente y la siguiente tabla son para describir el modo de transferencia. Muchas otras señales son usadas para modos de transición y para información adicional sobre el estado. La disposición del conector DB25 del puerto paralelo, en el panel de la computadora es:
DB-25 Hembra con sus líneas de señal
La tabla siguiente identifica los registros para el puerto paralelo estándar. El método básico de transferencia de datos hacia la impresora usando el puerto es descrito en la sección Modo de Compatibilidad. La posición del Registro se cuenta a partir de la dirección de memoria del puerto. Definición del Registro del Puerto Paralelo Estándar (SPP) Posición del Registro
Nombre
Lectura/Escritura
Descripción
0
Registro de Datos
Lectura y Escritura
Puerto de datos para leer o escribir datos
1
Registro de Estado
Lectura
Contiene los bits indicadores del status
2
Registro de Control
Escritura
Usado para establecer señales de control
Varios
-
Usado para distintas implementaciones
3-7
Modos de transferencia El uso de distintos modos de transferencia nos da la capacidad de crear un canal de dos sentidos entre la computadora anfitrión y el periférico conectado. Como sólo hay un juego de líneas de datos la comunicación es Half Duplex, o sea se transmiten datos en una dirección a la vez. El modo de operación de la compatibilidad y de Nibble se puede poner en ejecución en cualquier puerto paralelo existente para crear una trayectoria de comunicación bidireccional completa entre el anfitrión y el periférico. Los modos de la compatibilidad y de octeto (byte) se pueden también utilizar para crear una trayectoria de comunicación bidireccional, pero el puerto paralelo debe soportar la capacidad del modo de octeto. El modo de octeto requiere que un octeto entero de datos se pueda leer en las líneas de datos externas. Esto es implementado generalmente por la adición de un bit de dirección en el registro de control del puerto paralelo. Este tipo de puerto generalmente se llama un puerto paralelo "bidireccional". Los modos de EPP y de ECP tienen capacidad bidireccional como parte de su protocolo. Estos modos requieren que el hardware cree un estado de máquina que sea capaz automáticamente de generar los pulsos de control que son necesarios para estos modos de transferencia de datos del alto rendimiento.
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
Cada uno de los modos de funcionamiento, con excepción de la compatibilidad, renombra las señales del control y del estado para tener significado dentro del modo que es utilizado. Las discusiones para cada modo utilizarán los nombres constantes con el modo que es discutido.
Introducción al estándar IEEE 1284-1994 Este estándar define 5 modos de transferencia de datos. Cada uno provee un método de pasar datos entre la PC y el periférico (directa) y entre el periférico y la PC (inversa); o de manera bidireccional (half duplex). Los modos definidos son: Modo de Compatibilidad: modo estándar o “Centronics”, sólo en sentido directo. Modo Nibble: 4 bits a la vez usando las líneas de estado (Status) para datos (Hewlett Packard Bi-tronics), este mode es de dirección inversa: Modo de Octeto (Byte Mode): 8 bits a la vez usando las líneas de datos, a veces nombrado como puerto bidireccional. EPP (Enhanced Parallel Port): Puerto Paralelo Extendido, usado principalmente para periféricos que no son impresoras, como CD-ROM, Adaptadores de Red, etc. Este modo permite la comunicación bidireccional. ECP (Extended Capability Port): Puerto de Capacidades Extendidas, usado principalmente por impresoras recientes y scanners. Este modo permite la comunicación bidireccional. Todos los puertos paralelos pueden implementar un enlace bidireccional usando los modos Compatible y Nibble para transferir datos. El Modo de Octeto puede ser usado por cerca del 25% de los puertos básicos instalados; y los 3 modos anteriores transmiten los datos controlados por software. El manejador tiene que escribir los datos, revisar las líneas que establecen la conexión (handshake), por ejemplo que no haya una señal de ocupado, determinar las señales apropiadas de control, y entonces ir al siguiente byte. Esto es muy demandante y limita la efectividad del radio de transferencia de 50 a 100 Kbytes por segundo. Además de esos 3 modos previos, EPP y ECP están implementados en los controladores más nuevos de entrada y salida (I/O) por la mayoría de los fabricantes. Estos modos usan un control por hardware para asistir la transferencia de datos. Por ejemplo, en el modo EPP, un byte de datos puede ser transmitido a un periférico por una simple instrucción de salida. El controlador maneja todo el establecimiento de conexión y la transferencia de datos al periférico. Además de todo, el estándar provee lo siguiente: 5 modos de operación para transferir datos Un método para que la PC y el periférico determinen los modos soportados y negocien cual será usado. Define la Interfaz Física: Cables y conectores Define la Interfaz Eléctrica: Manejadores/Receptores, Terminación e Impedancia En conclusión, el puerto paralelo definido por el estándar IEEE 1284-1994 nos proporciona una interfaz fácil de usar y de alto rendimiento para periféricos diversos e impresoras.
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
I NTERCONEXIONES Entre dispositivos RS-232 La comunicación entre dos dispositivos RS-232 es la más sencilla y económica de implementar. Requiere simplemente el uso de un cable para interconectar ambos extremos, tomando la precaución de emplear el cable con los conectores correctos, de entre las dos posibles configuraciones que pudieran presentarse (DB9 – DB9 o DB25 – DB25). Si se requiere conectar DB9 a DB25 deberá incluirse además un adaptador de este tipo. Los precios varían entre $10 y $25 dólares, dependiendo del fabricante.
Null Modem DB9 a DB9
Null Modem DB25 a DB25 Adaptador DB25 a DB9
Entre dispositivos RS-232 y RS-422 o RS-485 La comunicación con un dispositivo que utilice alguno de estos dos estándares de aplicación principalmente en entornos industriales requiere el uso de un adaptador que interconecte el extremo de RS-232 con el otro. Existen convertidores de RS-232 a RS-422, y otros de RS-232 a RS-485, sin embargo, lo más recomendable es utilizar un convertidor de RS-232 a RS-422/485, que soportan ambos estándares, existen más opciones comerciales y no hay gran diferencia entre los precios de los adaptadores combinados y los sencillos. Los precios varían entre los $50 y los $100 dólares, dependiendo del fabricante. Algunos ejemplos de adaptadores sencillos son:
Adaptador RS-232 a RS-485 Adaptador RS-232 a RS-485
Adaptador RS-232 a RS-422
Algunos ejemplos de adaptadores combinados son:
Adaptador RS-232 a RS-422/485 Adaptador RS-232 a RS-422/485 Adaptador RS-232 a RS-422/485
Entre dispositivos USB y RS-232 Las computadoras portátiles han desplazado desde hace ya varios años a los equipos de escritorio en volumen de ventas en el mercado mundial, gracias a su versatilidad y conveniencia de uso, sin embargo, las portátiles actuales carecen en su mayoría de puertos de comunicación y paralelo, los
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
cuales han remplazado por múltiples puertos USB que, como ya se ha explicado, tienen ventajas de uso para la mayoría de las aplicaciones. No obstante lo anterior, eventualmente llegará a ser necesario conectar la computadora a un dispositivo RS-232 y escribir un programa para realizar alguna tarea específica con se dispositivo; en este caso será necesario utilizar un convertidor de USB a RS-232, que implementa mediante un hardware sencillo y un controlador o driver, la funcionalidad requerida. Este tipo de adaptadores se conectan por un extremo al puerto USB del equipo y cuentan en su extremo opuesto con un conector DB9 con el estándar RS-232. La mayoría de estos adaptadores funcionan impecablemente, aunque algunos pueden presentar fallas o retrasos en la información de hasta varios segundos, cuando han estado operando por algunas horas. Los adaptadores USB a RS-232 se consiguen con gran facilidad y su costo varía entre $12 y $50 dólares, dependiendo de la marca y características. Algunos ejemplos de este tipo de adaptadores son los siguientes:
Adaptadores sencillos USB a RS-232 Adaptador múltiple USB a RS232
Puerto Paralelo Real Trabajar con las líneas eléctricas de un puerto paralelo real es una tarea que debe realizarse con sumo cuidado, precaución y, especialmente, conocimiento de lo que se está haciendo, porque cualquier conexión que se realice incorrectamente puede dañar permanentemente el puerto o su tarjeta, en el mejor de los casos, o la tarjeta madre en casos de daños severos. El nivel eléctrico de los voltajes manejados en este puerto no es dañino ni perjudicial para el usuario, de ninguna manera, pero las acciones de éste sí pueden causar daños graves en la computadora. Para conectar elementos externos al puerto paralelo, es muy recomendable hacerlo a través de un adaptador que provea protección eléctrica, preferentemente por medio de optoaisladores; nunca será buena idea conectar sensores y circuitos directamente a las líneas que salen del puerto. A continuación se muestran algunos productos comerciales que permiten interconectar cualquier circuito externo al puerto paralelo de una computadora, en forma segura.
Interfaz LPT a tarjeta o protoboard
Interfaz LPT a cables
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
Puerto Paralelo Simulado para USB Como se explicó previamente para el caso de los adaptadores USB a RS-232, eventualmente podría estarse en la situación de tener que interconectar una computadora moderna a un circuito externo por medio de un puerto paralelo, contando solamente con puertos USB en el equipo. En este caso será necesario utilizar un convertidor de USB a Paralelo, que implementa mediante un hardware sencillo y un controlador o driver, la funcionalidad requerida. Este tipo de adaptadores se conectan por un extremo al puerto USB del equipo y cuentan en su extremo opuesto con un conector DB25 con las líneas y señales especificadas para el puerto paralelo. A diferencia de los adaptadores USB a RS-232, de los que la mayoría funciona bien, en el caso de los adaptadores a paralelo no es así, ya que fueron diseñados concretamente para conectar impresoras que incorporan un puerto Centronics y nada más, por lo que al momento de tratar de usar esos puertos simulados como se haría con un puerto paralelo real, los resultados no son los esperados. Los adaptadores USB a Paralelo no se consiguen con gran facilidad y su costo varía entre $12 y $50 dólares, dependiendo de la marca y características. Existe un fabricante que afirma tener un adaptador USB a Paralelo con funcionalidad real, pero al menos en mi caso, no ha sido posible validar su funcionamiento. Algunos ejemplos de este tipo de adaptadores son los siguientes:
Adaptadores USB a paralelo de uso limitado a impresora
Adaptador USB a paralelo bidireccional
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
P ROGRAMACIÓN
CON EL P UERTO
S ERIE
Conexión física Se entiende que para iniciar la elaboración de un programa que utilice el puerto serie, se habrán cubierto ya los requerimientos de hardware, como se ha detallado en las secciones previas. Se asume que ya se tienen instalados los cables, adaptadores e interfaces necesarias para implementar la comunicación.
Funcionalidad en diferentes versiones de .net Mientras que en la versión 1.1 de .net el soporte para la comunicación serie era limitado, a partir de la versión 2.0 se introdujeron mejoras que permiten utilizar en forma más eficiente este recurso. La implementación de un programa para comunicación serie en Visual C# debe utilizar la clase System.IO.Ports.SerialPort, que viene incluida gratuitamente en este lenguaje.
Funcionalidades más comunes Las funcionalidades que se deben implementar como mínimo en cualquier programa que soporte comunicación serie son: Creación del objeto SerialPort Configuración de los parámetros del puerto serie Escritura Lectura Verificación del puerto abierto Enumeración de puertos
Creación del objeto SerialPort Declarar el uso del nombre de espacio IO: using System.IO.Ports;
Al inicio del programa se crea el objeto que se usará para tener acceso al puerto: static SerialPort _serialPort;
Inicialización del puerto Una vez creado el objeto, se configuran los parámetros del puerto: _serialPort.PortName = “COM1”; _serialPort.BaudRate = 9600; _serialPort.Parity = Parity.None; _serialPort.DataBits = 8; _serialPort.StopBits = StopBits.One;
También podría haberse configurado los parámetros del puerto al momento de la creación del objeto, usando la sintaxis que se indica a continuación: private SerialPort _serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
Se recomienda también configurar los tiempos de espera, tanto de lectura como de escritura:
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET _serialPort.ReadTimeout = 500; _serialPort.WriteTimeout = 500;
Finalmente, abrir el puerto para dejarlo listo para su uso: _serialPort.Open();
Verificación del puerto abierto Antes de intentar escribir en el puerto, es conveniente verificar que éste se encuentre abierto, utilizando el siguiente comando: string message = _serialPort.IsOpen();
Escritura Para escribir a un puerto previamente abierto, se utiliza el siguiente comando: _serialPort.WriteLine(“MENSAJE”);
En el caso de que se requiera enviar por el puerto una cadena de bytes, el envío debe implementarse de esta forma: byte[] mBuffer= new byte[1]; mBuffer[0] = 0x4D; //ASCII letra 'M'. mBuffer[1] = 0x45; //ASCII letra 'E'. mBuffer[2] = 0x4E; //ASCII letra 'N'. mBuffer[3] = 0x53; //ASCII letra 'S'. mBuffer[4] = 0x41; //ASCII letra 'A'. mBuffer[5] = 0x4A; //ASCII letra 'J'. mBuffer[6] = 0x45; //ASCII letra 'E'. mBuffer[7] = 0x74; //ASCII letra 't'. mBuffer[0] = 0x74; //ASCII letra"t". serialPort1.Write(mBuffer, 0, mBuffer.Length);
Lectura Para leer los datos recibidos por el puerto, se utiliza el siguiente comando: string message = _serialPort.ReadLine();
Enumeración de puertos Es necesario con frecuencia, enlistar los puertos disponibles en un equipo, lo que se implementa de la siguiente forma: string[] _SerialPortNames = System.IO.Ports.SerialPort.GetPortNames();
Envío de archivos A continuación se dan dos pequeños métodos que resultan de mucha utilidad para el envío de archivos por medio del puerto serie. Se presentan en forma esencial, pero en la práctica se deberá siempre verificar que el puerto esté abierto antes de intentar escribir en él y usar una estructura Try/Catch para atrapar errores en tiempo de ejecución al momento de intentar abrir el archivo. La rutina de envío en binario está limitada a aproximadamente 2GB (el tamaño de un int), lo cual debería ser suficiente para la mayoría de los casos reales.
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET private static void SendTextFile(SerialPort port, string FileName) { port.Write(File.OpenText(FileName).ReadToEnd()); } private static void SendBinaryFile(SerialPort port, string FileName) { using (FileStream fs = File.OpenRead(FileName)) port.Write((new BinaryReader(fs)).ReadBytes( (int)fs.Length), 0, (int)fs.Length); }
Ejemplo 1: Escritura El siguiente programa implementa una sencilla aplicación para escribir al puerto. Para probarlo es necesario ejecutar en otra computadora el programa del Ejemplo 2, y que ambas estén conectadas correctamente por medio del puerto serie. using System.IO.Ports; private static void SendSampleData() { // Instantiate the communications // port with some basic settings SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); // Open the port for communications port.Open(); // Write a string port.Write("Hello World"); // Write a set of bytes port.Write(new byte[] {0x0A, 0xE2, 0xFF}, 0, 3); // Close the port port.Close(); }
Ejemplo 2: Lectura El siguiente programa implementa una sencilla aplicación para leer los datos recibidos en el puerto. Para probarlo es necesario ejecutar en otra computadora el programa del Ejemplo 1, y que ambas estén conectadas correctamente por medio del puerto serie. #region Namespace Inclusions using System; using System.IO.Ports; using System.Windows.Forms; #endregion namespace SerialPortExample { class SerialPortProgram { // Create the serial port with basic settings private SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); [STAThread] static void Main(string[] args) { // Instatiate this class new SerialPortProgram(); }
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET private SerialPortProgram() { Console.WriteLine("Incoming Data:"); // Attach a method to be called when there // is data waiting in the port's buffer port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); // Begin communications port.Open(); // Enter an application loop to keep this thread alive Application.Run(); } private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { // Show all the incoming data in the port's buffer Console.WriteLine(port.ReadExisting()); } } }
Ejemplo 3: Chat El siguiente programa implementa una sencilla aplicación de chat entre dos computadoras, utilizando las funcionalidades básicas descritas. Para probarlo es necesario ejecutar en otra computadora este mismo programa, y que ambas estén conectadas correctamente por medio del puerto serie. using System; using System.IO.Ports; using System.Threading; public class PortChat { static bool _continue; static SerialPort _serialPort; public static void Main() { string name; string message; StringComparer stringComparer = StringComparer.OrdinalIgnoreCase; Thread readThread = new Thread(Read); // Create a new SerialPort object with default settings. _serialPort = new SerialPort(); // Allow the user to set the appropriate properties. _serialPort.PortName = SetPortName(_serialPort.PortName); _serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate); _serialPort.Parity = SetPortParity(_serialPort.Parity); _serialPort.DataBits = SetPortDataBits(_serialPort.DataBits); _serialPort.StopBits = SetPortStopBits(_serialPort.StopBits); _serialPort.Handshake = SetPortHandshake(_serialPort.Handshake); // Set the read/write timeouts _serialPort.ReadTimeout = 500; _serialPort.WriteTimeout = 500; _serialPort.Open(); _continue = true; readThread.Start(); Console.Write("Name: "); name = Console.ReadLine();
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
Console.WriteLine("Type QUIT to exit"); while (_continue) { message = Console.ReadLine(); if (stringComparer.Equals("quit", message)) { _continue = false; } else { _serialPort.WriteLine( String.Format("<{0}>: {1}", name, message) ); } } readThread.Join(); _serialPort.Close(); } public static void Read() { while (_continue) { try { string message = _serialPort.ReadLine(); Console.WriteLine(message); } catch (TimeoutException) { } } } public static string SetPortName(string defaultPortName) { string portName; Console.WriteLine("Available Ports:"); foreach (string s in SerialPort.GetPortNames()) { Console.WriteLine(" {0}", s); } Console.Write("COM port({0}): ", defaultPortName); portName = Console.ReadLine(); if (portName == "") { portName = defaultPortName; } return portName; } public static int SetPortBaudRate(int defaultPortBaudRate) { string baudRate; Console.Write("Baud Rate({0}): ", defaultPortBaudRate); baudRate = Console.ReadLine(); if (baudRate == "") { baudRate = defaultPortBaudRate.ToString(); } return int.Parse(baudRate); } public static Parity SetPortParity(Parity defaultPortParity)
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET { string parity; Console.WriteLine("Available Parity options:"); foreach (string s in Enum.GetNames(typeof(Parity))) { Console.WriteLine(" {0}", s); } Console.Write("Parity({0}):", defaultPortParity.ToString()); parity = Console.ReadLine(); if (parity == "") { parity = defaultPortParity.ToString(); } return (Parity)Enum.Parse(typeof(Parity), parity); } public static int SetPortDataBits(int defaultPortDataBits) { string dataBits; Console.Write("Data Bits({0}): ", defaultPortDataBits); dataBits = Console.ReadLine(); if (dataBits == "") { dataBits = defaultPortDataBits.ToString(); } return int.Parse(dataBits); } public static StopBits SetPortStopBits(StopBits defaultPortStopBits) { string stopBits; Console.WriteLine("Available Stop Bits options:"); foreach (string s in Enum.GetNames(typeof(StopBits))) { Console.WriteLine(" {0}", s); } Console.Write("Stop Bits({0}):", defaultPortStopBits.ToString()); stopBits = Console.ReadLine(); if (stopBits == "") { stopBits = defaultPortStopBits.ToString(); } return (StopBits)Enum.Parse(typeof(StopBits), stopBits); } public static Handshake SetPortHandshake(Handshake defaultPortHandshake) { string handshake; Console.WriteLine("Available Handshake options:"); foreach (string s in Enum.GetNames(typeof(Handshake))) { Console.WriteLine(" {0}", s); } Console.Write("Stop Bits({0}):", defaultPortHandshake.ToString()); handshake = Console.ReadLine(); if (handshake == "") {
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET handshake = defaultPortHandshake.ToString(); } return (Handshake)Enum.Parse(typeof(Handshake), handshake); } }
La clase SerialPort Como ya se mencionó previamente, esta clase proporciona todo el soporte para implementar aplicaciones con comunicación serie. En esta sección se han mostrado las funcionalidades esenciales para una aplicación, pero el nivel de control que permite sobre el puerto puede ser tan completo como se requiera, utilizando el resto de los métodos, propiedades y eventos que la clase ofrece, los cuales se detallan como referencia. La clase SerialPort se utiliza para controlar un recurso de archivo de puerto serie. Esta clase proporciona E/S sincrónica y orientada a eventos, acceso a los estados de punto de conexión e interrupción, así como acceso a las propiedades del controlador serie. Además, la funcionalidad de esta clase se puede contener en un objeto Stream interno, accesible por medio de la propiedad BaseStream, y pasarla a clases que contengan o utilicen secuencias. La clase SerialPort admite las codificaciones siguientes: ASCIIEncoding, UTF8Encoding, UnicodeEncoding, UTF32Encoding y cualquier codificación definida en mscorlib.dll donde la página de códigos sea menor que 50000 o sea 54936. Se pueden utilizar codificaciones alternativas, pero es preciso usar el método ReadByte o Write y el usuario debe realizar la codificación por sí 16
mismo.
El tipo SerialPort
17
expone los siguientes miembros:
Constructores Nombre
Descripción
SerialPort
Sobrecargado. Inicializa una instancia nueva de la clase SerialPort.
Métodos
16 17
Nombre
Descripción
Close
Cierra la conexión del puerto, establece el valor de la propiedad IsOpen en false y elimina el objeto Stream interno.
CreateObjRef
Crea un objeto que contiene toda la información relevante necesaria para generar un proxy utilizado para comunicarse con un objeto remoto. (Se hereda de MarshalByRefObject).
DiscardInBuffer
Descarta los datos del búfer de recepción del controlador serie.
DiscardOutBuffer
Descarta los datos del búfer de transmisión del controlador serie.
Dispose
Sobrecargado. Libera los recursos no administrados que utiliza el objeto SerialPort.
Equals
Determina si el objeto Object especificado es igual al objeto Object actual. (Se hereda de Object).
Finalize
Libera recursos no administrados y realiza otras operaciones de limpieza antes de que se reclame el objeto Component durante la recolección de elementos no utilizados. (Se hereda de Component).
MSDN. SerialPort (Clase). Microsoft. 2007. http://msdn.microsoft.com/es-es/library/system.io.ports.serialport.aspx MSDN. SerialPort (Miembros). Microsoft. 2007. http://msdn.microsoft.com/es-es/library/system.io.ports.serialport_members.aspx
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET GetHashCode
Actúa como función hash para un tipo concreto. (Se hereda de Object).
GetLifetimeService
Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia. (Se hereda de MarshalByRefObject).
GetPortNames
Obtiene una matriz con los nombres de los puertos serie del equipo actual.
GetService
Devuelve un objeto que representa el servicio suministrado por Component o por Container. (Se hereda de Component).
GetType
Obtiene el objeto Type de la instancia actual. (Se hereda de Object).
InitializeLifetimeService
Obtiene un objeto de servicio de duración para controlar la directiva de duración de esta instancia. (Se hereda de MarshalByRefObject).
MemberwiseClone
Sobrecargado.
Open
Abre una nueva conexión de puerto serie.
Read
Sobrecargado. Lee datos del búfer de entrada de SerialPort.
ReadByte
Lee sincrónicamente un byte del búfer de entrada de SerialPort.
ReadChar
Lee sincrónicamente un carácter del búfer de entrada de SerialPort.
ReadExisting
Lee todos los bytes inmediatamente disponibles, basándose en la codificación, en la secuencia y el búfer de entrada del objeto SerialPort.
ReadLine
Lee hasta el valor de NewLine en el búfer de entrada.
ReadTo
Lee una cadena hasta el value especificado en el búfer de entrada.
ToString
Sobrecargado.
Write
Sobrecargado. Escribe datos en el búfer de salida del puerto serie.
WriteLine
Escribe la cadena especificada y el valor de NewLine en el búfer de salida.
Campos Nombre
Descripción
InfiniteTimeout
Indica que no se debe agotar el tiempo de espera.
Propiedades Nombre
Descripción
BaseStream
Obtiene el objeto Stream subyacente para un objeto SerialPort.
BaudRate
Obtiene o establece la velocidad en baudios del puerto serie.
BreakState
Obtiene o establece el estado de la señal de interrupción.
BytesToRead
Obtiene el número de bytes de datos en el búfer de recepción.
BytesToWrite
Obtiene el número de bytes de datos en el búfer de envío.
CanRaiseEvents
Obtiene un valor que indica si el componente puede provocar un evento. (Se hereda de Component).
CDHolding
Obtiene el estado de la línea de detección de portadora para el puerto.
Container
Obtiene IContainer que contiene Component. (Se hereda de Component).
CtsHolding
Obtiene el estado de la línea Listo para enviar.
DataBits
Obtiene o establece la longitud estándar de los bits de datos por byte.
DesignMode
Obtiene un valor que indica si Component está actualmente en modo de diseño. (Se hereda de Component).
DiscardNull
Obtiene o establece un valor que indica si no se tienen en cuenta los bytes nulos en las transmisiones entre el puerto y el búfer de recepción.
DsrHolding
Obtiene el estado de la señal Conjunto de datos preparado (DSR).
DtrEnable
Obtiene o establece un valor que habilita la señal Terminal de datos preparado (DTR) durante la comunicación en serie.
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET Encoding
Obtiene o establece la codificación de bytes para la conversión de texto previa y posterior a la transmisión.
Events
Obtiene la lista de controladores de eventos asociados a Component. (Se hereda de Component).
Handshake
Obtiene o establece el protocolo de enlace para la transmisión de datos a través del puerto serie.
IsOpen
Obtiene un valor que indica el estado abierto o cerrado del objeto SerialPort.
NewLine
Obtiene o establece el valor utilizado para interpretar el final de una llamada a los métodos ReadLine y WriteLine.
Parity
Obtiene o establece el protocolo de comprobación de la paridad.
ParityReplace
Obtiene o establece el byte que reemplaza los bytes no válidos en una secuencia de datos cuando se produce un error de paridad.
PortName
Obtiene o establece el puerto de comunicaciones, incluidos por lo menos todos los puertos COM disponibles.
ReadBufferSize
Obtiene o establece el tamaño del búfer de entrada de SerialPort.
ReadTimeout
Obtiene o establece el número de milisegundos que transcurren antes de que se agote el tiempo de espera si una operación de lectura no finaliza.
ReceivedBytesThreshold
Obtiene o establece el número de bytes en el búfer de entrada interno antes de que ocurra un evento DataReceived.
RtsEnable
Obtiene o establece un valor que indica si la señal Solicitud de envío (RTS) está habilitada durante la comunicación en serie.
Site
Obtiene o establece ISite de Component. (Se hereda de Component).
StopBits
Obtiene o establece el número estándar de bits de parada por byte.
WriteBufferSize
Obtiene o establece el tamaño del búfer de salida del puerto serie.
WriteTimeout
Obtiene o establece el número de milisegundos que transcurren antes de que se agote el tiempo de espera si una operación de escritura no finaliza.
Eventos Nombre
Descripción
DataReceived
Representa el método que controlará el evento de recepción de datos de un objeto SerialPort.
Disposed
Se produce cuando el componente se elimina mediante una llamada al método Dispose. (Se hereda de Component).
ErrorReceived
Representa el método que controlará el evento de error de un objeto SerialPort.
PinChanged
Representa el método que controlará el evento de cambio de punto de conexión serie de un objeto SerialPort.
El espacio de nombres System.IO.Ports A manera de referencia se incluyen aquí los detalles de este recurso. El espacio de nombres System.IO.Ports contiene clases para controlar puertos serie. La clase más importante, SerialPort, proporciona un marco de trabajo para la E/S sincrónica y orientada a eventos, el acceso a los estados de punto de conexión e interrupción y el acceso a las propiedades del controlador serie. Se puede usar para ajustar objetos Stream, permitiendo que las clases que utilizan secuencias obtengan acceso al puerto serie.
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
El espacio de nombres incluye enumeraciones que simplifican el control de los puertos serie, como Handshake, Parity, SerialPinChange y StopBits.
18
Clases Clase
Descripción
SerialDataReceivedEventArgs
Proporciona datos del evento DataReceived.
SerialErrorReceivedEventArgs
Proporciona datos del evento ErrorReceived.
SerialPinChangedEventArgs
Proporciona datos del evento PinChanged.
SerialPort
Representa un recurso de puerto serie.
Delegados Delegado
Descripción
SerialDataReceivedEventHandler
Representa el método que controlará el evento DataReceived de un objeto SerialPort.
SerialErrorReceivedEventHandler
Representa el método que controlará el evento ErrorReceived de un objeto SerialPort.
SerialPinChangedEventHandler
Representa el método que controlará el evento PinChanged de un objeto SerialPort.
Enumeraciones
18
Enumeración
Descripción
Handshake
Especifica el protocolo de control utilizado para establecer una comunicación con un puerto serie para un objeto SerialPort.
Parity
Especifica el bit de paridad de un objeto SerialPort.
SerialData
Especifica el tipo de carácter recibido en el puerto serie del objeto SerialPort.
SerialError
Especifica los errores que se producen en el objeto SerialPort.
SerialPinChange
Especifica el tipo de cambio que se ha producido en el objeto SerialPort.
StopBits
Especifica el número de bits de parada utilizado en el objeto SerialPort.
Microsoft. MSDN: System.IO.Ports (Espacio de nombres). Estados Unidos. 2007. http://msdn.microsoft.com/es-es/library/system.io. ports.aspx
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
P ROGRAMACIÓN
CON EL P UERTO
P ARALELO
Restricciones del Sistema Operativo Escribir programas que utilizaran el puerto paralelo era una tarea muy fácil en los antiguos sistemas operativos DOS y Windows 95/98, en donde se podía usar las funciones Inporb y Outporb, o Inp() y Outp() dentro de un programa sin problema alguno. Sin embargo, con la llegada de los sistemas operativos basados en NT, como Win NT4, Win2000 y WinXP, se acabó esa posibilidad, quien haya estado interesado en escribir programas que hagan uso del puerto paralelo seguramente habrá experimentado problemas.
19
Lo anterior se debe a que Windows NT es un sistema operativo muy seguro, que asigna algunos privilegios y restricciones a los diferentes tipos de programas que se ejecuten dentro de él, clasificándolos en dos categorías: Modo Usuario y Modo Kernel. Los programas en modo usuario normalmente se ejecutan en modo ring3, mientras que los programas en modo kernel se ejecutan en modo ring0. Los programas que uno elabora caen en la categoría de Modo Usuario, en la cual se restringe el uso de instrucciones como IN, OUT, etc. Siempre que el sistema operativo encuentra que un programa en modo usuario intenta ejecutar tales instrucciones, el S.O. detiene la ejecución del programa y muestra un mensaje de error. En cambio, los programas en Modo Kernel no tienen esa restricción, y los controladores o drivers son capaces de ejecutarse en este modo, por lo que la solución al problema anterior es escribir un controlador en modo kernel que escriba y lea datos por medio del puerto paralelo.
Uso de librerías externas Por lo anteriormente expuesto, es necesario utilizar recursos de terceros. Existe una librería muy referida en foros y tutoriales en Internet, llamada inpout32.dll, que funciona muy bien para hacer aplicaciones que utilicen este puerto. En mi experiencia, utilicé esta librería hace algunos años con Visual Basic 6, para crear una estación de pruebas funcionales en una línea de producción; la implementación fue muy sencilla, el programa funcionó sin problemas e incluso hoy en día se sigue utilizando sin que haya presentado problemas desde entonces. Para esa aplicación también tuve que crear un accesorio de hardware al que se conecta el puerto paralelo de la computadora, para realizar la tarea para la que fue creado. Una restricción importante que se debe tomar en cuenta es que esta librería funciona en Windows XP y previos. Su uso con Windows Vista no está documentado por su creador.
Implementación Para implementar el uso del puerto paralelo en una aplicación, debe aplicarse el procedimiento siguiente:
20
19
Logix4u. Inpout32.dll for Windows 98/2000/NT/XP MSDN. Estados Unidos. 2006. http://logix4u.net/Legacy_Ports/Parallel_Port/ Inpout32.dll_for_Windows_98/2000/NT/XP.html 20 Gonzaga, Jeff. eHow: How to program a parallel port using c# the way you want.Estados Unidos. 2009. http://www.ehow.com/how_ 2186075_ port-using-c-way-want.html
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
1. Descargar del sitio www.logix4u.net la librería inpout32.dll y guardarla en la carpeta System32. 2. Incluir la librería System.Runtime.InteropServices in el programa. 3. Crear una clase nueva para el .dll que se estará usando (inpout32.dll). 4. Usar la herramienta de C# para importer librerías dll. namespace IntruderAlarm { class PortInterop { [DllImport("inpout32.dll",EntryPoint="Out32")] public static extern void Output(int address,int value); [DllImport("inpout32.dll",EntryPoint="Inp32")] public static extern int Input(int address); } }
5. En el programa principal puede ahora llamarse los métodos input y output de la siguiente forma: PortInterop.Input(889); PortInterop.Output(888,64); // this is the format if your class is named PortInterop
El uso de estas funciones es indicando la dirección del puerto, en ambos casos, aunque en el caso del comando Output también se debe indicar el valor que será escrito en el puerto. No se debe olvidar que el puerto paralelo tiene 8 bits de datos, por lo que el número que se escriba (en el ejemplo es 64) nunca deberá ser mayor a 255.
Ejemplo El siguiente programa implementa una clase que permite el uso del puerto paralelo. using System; using System.Runtime.InteropServices; /// <summary> /// Class to access the Port API's from the inpout32.dll. /// public class PortAccessAPI { /// <summary> /// This method will be used to send the data out to the parallel port. /// /// <param name="adress">Address of the port to which the data will be sent. /// <param name="value">Data that need to send out. [DllImport("inpout32.dll", EntryPoint="Out32")] public static extern void Output(int address, int value); /// <summary> /// This method will be used to receive any data from the parallel port. /// /// <param name="address">Address of the port from which the data will be received. /// Returns Integer read from the given port. [DllImport("inpout32.dll", EntryPoint = "Inp32")] public static extern int Input(int address); }
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
C ONCLUSIONES La elaboración de programas que trabajen con información obtenida de dispositivos externos, o que interactúen con ellos, puede parecer a primera vista una labor compleja, aunque en realidad no es algo imposible ni reservado para personas con conocimientos especiales, como se ha visto en este documento que trata de resumir en forma breve, sencilla y práctica los pasos y conocimientos prácticos necesarios para emprender un proyecto de esta naturaleza. Por otra parte, el lenguaje de programación C ofrece el mejor punto de equilibrio para las aplicaciones de instrumentación, por todas sus bondades ya conocidas. Aunque inicialmente la plataforma .net carecía de un soporte para realizar un manejo de puertos eficiente, a partir de la versión .net 2.0 esta deficiencia fue subsanada, por lo que ahora es posible trabajar con los puertos sin mayores problemas.
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
I NFOGRAFÍA Bibliografía Tompkins, Willis J.; Webster, John G. Interfacing sensors to the IBM PC. Estados Unidos. 1988. Prentice Hall.
Sherman, Kenneth Data Communications. A users guide. Estados Unidos. 1981. Prentice Hall.
Referencias en Línea AGG Software Serial (RS232) port interface pinout and signals. Estados Unidos. 2007. http://www.aggsoft.com/rs232-pinout-cable/ pinout-and-signal.htm
Gonzaga, Jeff eHow: How to program a parallel port using c# the way you want.Estados Unidos. 2009. http://www.ehow.com/how_2186075_ port-using-c-way-want.html
Interfaces W&T Interfaz RS422. Inglaterra. 2005. http://www.wut.de/e-6wwww-10-apes-000.php
Logix4u Inpout32.dll for Windows 98/2000/NT/XP MSDN. Estados Unidos. 2006. http://logix4u.net/Legacy_Ports/Parallel_Port/Inpout32.dll_for_Windows_98/2000/NT/XP.html
Microsoft MSDN: SerialPort (Clase). Estados Unidos. 2007. http://msdn.microsoft.com/es-es/library/system.io.ports.serialport.aspx
MSDN: SerialPort (Miembros). Estados Unidos. 2007. http://msdn.microsoft.com/eses/library/system.io.ports.serialport_members.aspx
MSDN: System.IO.Ports (Espacio de nombres). Estados Unidos. 2007. http://msdn.microsoft.com/es-es/library/system.io.ports.aspx
Pinouts.Ru USB Pinout. Estados Unidos. 2005. http://pinouts.ru/Slots/USB_pinout.shtml
TechFAQ What is a computer port? Estados Unidos. 2009. http://www.tech-faq.com/computer-port.shtml
Wikipedia en Español Entrada/Salida. Estados Unidos. 2009. http://es.wikipedia.org/wiki/Entrada/salida
Estándar. Estados Unidos. 2009. http://es.wikipedia.org/wiki/Est%C3%A1ndar
IEEE 1284. Estados Unidos. 2009. http://es.wikipedia.org/wiki/IEEE_1284
Protocolo de comunicaciones. Estados Unidos. 2009. http://es.wikipedia.org/wiki/Protocolo_de_comunicaci% C3%B3n
Puerto serie. Estados Unidos. 2009. http://es.wikipedia.org/wiki/Puerto_serie
Puerto paralelo. Estados Unidos. 2009. http://es.wikipedia.org/wiki/Puerto_paralelo
MANUEL DE JESÚS CHAVIRA TOVAR
PROGRAMACIÓN ORIENTADA A OBJETOS MANEJO DE PUERTOS EN C#.NET
RS-232. Estados Unidos. 2009. http://es.wikipedia.org/wiki/RS232
RS-485. Estados Unidos. 2009. http://es.wikipedia.org/wiki/RS-485
Telecomunicación. Estados Unidos. 2009. http://es.wikipedia.org/wiki/Telecomunicaci%C3%B3n
Telemetría. Estados Unidos. 2009. http://es.wikipedia.org/wiki/Telemetr%C3%ADa
Universal Serial Bus. Estados Unidos. 2009. http://es.wikipedia.org/wiki/USB
MANUEL DE JESÚS CHAVIRA TOVAR