C sharp NET / Capítulo 28

De Wikilibros, la colección de libros de texto de contenido libre.

Tabla de contenidos

[editar] Manejo de puertos con Mono y C#

[editar] Introducción

El objetivo de este capitulo es mostrar como usar la implementación de System.IO.Ports, que hace posible leer y escribir en un puerto serial (RS-232) con Mono.

[editar] Limitantes

En este momento existen una serie de limitantes a tomar en cuenta.

1) No hay un evento que notifique la recepción de datos. Si deseas recibir información, hay que establecer un tiempo de espera (timeout) y observar si se reciben datos con ReadByte() cuando consideres que debe estar enviando información. 2) Debe leerse los datos en un arreglo de bytes (byte[]) ya que no hay soporte para arreglos de caracteres (char[]) o strings, por lo que debes de traducir los bytes recibidos a tu encodig. 3) Las funciones DiscardNull, ParityReplace, ReceivedBytesThreshold no están implementadas.


[editar] Código de ejemplo

Este codigo puede usarse para probar una conexión via un MODEM serial conectado al puerto /dev/ttyS0

using System;
using System.IO.Ports;

public class SerialPortTest
{
        public static void Main(string[] args) 
        {
                SerialPortTest myTest = new SerialPortTest();
                myTest.Test();
        }
 
        private SerialPort mySerial;
 
        // Constructor
        public SerialPortTest()
        {
        }
 
        public void Test()
        {
                if (mySerial != null)
                        if (mySerial.IsOpen)
                                mySerial.Close();
 
                mySerial = new SerialPort("/dev/ttyS0", 38400);
                mySerial.Open();
                mySerial.ReadTimeout = 400;
                SendData("ATI3\r");
 
                // Should output some information about your modem  firmware
                Console.WriteLine(ReadData());  
        }
 
        public string ReadData()
        {
                byte tmpByte;
                string rxString = "";
                        
                tmpByte = (byte) mySerial.ReadByte();
 
                while (tmpByte != 255) {
                        rxString += ((char) tmpByte);
                        tmpByte = (byte) mySerial.ReadByte();                   
                }
        
                return rxString;
        }
 
        public bool SendData(string Data)
        {
                mySerial.Write(Data);
                return true;            
        }
 }

Graba este programa en un archivo con extensión .cs (por ejemplo SerialExample.cs).

Entonces compílalo con la siguiente instrucción:

gmcs SerialExample.cs

Nota. Es importante que uses gmcs en lugar mcs

Y puedes ejecutar el resultado de la siguiente manera:

mono SerialExample.exe

Suponiendo que esta conectado un MODEM serial, el programa deberá registrar la siguiente salida:

$ mono SerialExample.exe  
Sportster 14,400/FAX RS Rev. 1.5  
OK

Ahora puedes acceder tu dispositivo serial en Linux desarrollando con Mono


[editar] Puntos a considerar

Un punto clave a tener en cuenta es que el usuario que ejecute la aplicación debe de tener permisos sobre el fichero del controlador del puerto, esto se verifica ejecutando la siguiente instrucción dentro de la consola.

ls -l /dev/ttyS0

Donde /dev/ttyS0 es el puerto con el que quieres establecer comunicación (no hay que perder de vista que en Linux los puertos son tratados como archivos)

El resultado del comando será una lista de los permisos sobre el puerto, por ejemplo

$ ls -l /dev/ttyS0
crw-rw---- 1 root dialout 4, 64 2007-05-25 10:28 /dev/ttyS0

Donde las letras tienen los siguientes significados:

c - Dispositivo de caracteres (tty o impresora) r - Permiso de lectura w - Permiso de escritura

Esta es la estructura de los permisos

-rw- rw- r--
|||| ||| |||-----------> Acceso para alguien que no es dueño (other)
|||| ||| ----------------> Acceso para miembros del grupo (group)
|||| ----------------------> Acceso para el dueño (user)
|-------------------------> Tipo de archivo (archivo, directorio, dispositivo, etc)

Si el usuario no tiene permisos se lanza una excepción IOException, por lo que es importante validar los permisos asignados con el usuario que se ejecuta la aplicación.

[editar] Links relacionados

Aquí hay unos links que podrían ser de utilidad. .NET Serial Port Library (http://sourceforge.net/projects/serialportnet/) Este proyecto tiene como objetivo implementar el namespace System.IO.Ports por completo para el framework 1.1 de .NET.

Herramientas personales