C sharp NET/Capítulo 28
Manejo de puertos con Mono y C#
editar
Introducción
editarEl objetivo de este capitulo es mostrar como usar la implementación de System.IO.Ports, que hace posible leer y escribir en un puerto serie (RS-232) con Mono.
Limitaciones
editarEn este momento existen una serie de limitaciones 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 vector de bytes (byte[]) ya que no hay soporte para vectores de caracteres (char[]) o strings, por lo que se debe traducir los bytes recibidos al encodig deseado. 3) Las funciones DiscardNull, ParityReplace, ReceivedBytesThreshold no están implementadas.
Código de ejemplo
editarEste 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; } }
Grabe este programa en un archivo con extensión .cs (por ejemplo SerialExample.cs).
Entonces compílelo con la siguiente instrucción:
gmcs SerialExample.cs
Nota. Es importante que use gmcs en lugar mcs
Y puede ejecutar el resultado de la siguiente manera:
mono SerialExample.exe
Suponiendo que esté conectado un MODEM serial, el programa deberá registrar la siguiente salida:
$ mono SerialExample.exe Sportster 14,400/FAX RS Rev. 1.5 OK
Ahora puede acceder su dispositivo serie en Linux desarrollando con Mono
Puntos a considerar
editarUn 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.
Links relacionados
editarAquí 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.