C sharp NET/Capítulo 28

Versión para imprimir esta pagina

Manejo de puertos con Mono y C#

editar



Introducción

editar

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 serie (RS-232) con Mono.

Limitaciones

editar

En 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

editar

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;		
	}
 }

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

editar

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

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.


Versión para imprimir esta pagina