domingo, 1 de septiembre de 2013

Puerto Serial Mono C# Sharp



Creación de un Software que sea capaz de escuchar por el Puerto Serial utilizando C# con Mono, la aplicación debe tener varias utilidades la idea principal es que sea multi-plataforma y que sea capaz de comunicarse con una base de datos.

En la creación de esta herramienta me he ido encontrando con varios inconvenientes por la poca documentación que existe sobre C# Mono, tratare de ir explicando los pasos y proceso tan claro como pueda, este proyecto es bastante ambicioso ya que va a ser mi primer programa utilizando este lenguaje y fusionando tanto en Windows como en Linux con Mono.

Esta aplicación se esta haciendo bajo plataforma Linux Ubuntu 10.04, para la programación de la aplicación se instaló Monodevelop 2.4 y sus respectivos plugin y librerías.

En el Archivo Main.cs escribiremos el siguiente Código
using System;
using System.IO.Ports;
using System.IO;
using System.Collections.Generic;
 
namespace kenport
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            Console.WriteLine ("Ken-Port!");
 
            // Detecta y muestra los puertos seriales del computador
            dispositivo listport;
            listport=new dispositivo();
 
            // Detectar Sistema Operativo
            os_detec my_os = new os_detec ();
            my_os.os ();
 
            // Se Conecta al Puerto y muestra la tama en pantalla
            // a su vez lo guarda en un txt
            serial_port myTest = new serial_port ();
            myTest.Test ();
        }
    }
}   

Ahora vamos a agregar una clase dispositivos.cs , en ella vamos a crear varias clases que nos van a servir para detectar que dispositivos seriales existen en la maquina en la que vamos hacer correr el programa.


using System;
using System.IO;
using System.IO.Ports;
 
namespace kenport
{
    public class os_detec
    {
        // Constructor
        public os_detec ()
        {
 
        }
        public void os ()
        {
            //Declarar los mensajes y su contenido
            string msg1 = "Windows.";
            string msg2 = "Unix.";
            string msg3 = "ERROR: Plataforma no Identificada.";
 
            //Declarar los mensajes y su contenido
            OperatingSystem os = Environment.OSVersion;
            PlatformID pid = os.Platform;
            switch (pid) {
            case PlatformID.Win32NT:
            case PlatformID.Win32S:
            case PlatformID.Win32Windows:
            case PlatformID.WinCE:
                Console.WriteLine (msg1);
                break;
            case PlatformID.Unix:
                Console.WriteLine (msg2);
                break;
            default:
                Console.WriteLine (msg3);
                break;
            }
        }
    }
 
    public class dispositivo
    {
 
        public dispositivo ()
        {
 
        }
        public void list_com ()
        {
            // crear lista con los nombre de los puertos seriales.
            string[] ports = SerialPort.GetPortNames ();
 
            Console.WriteLine ("The following serial ports were found:");
 
            // Display each port name to the console.
            foreach (string port in ports) {
                Console.WriteLine (port);
            }
            Console.ReadLine ();
        }
    }
}

Ahora vamos a crear la otra Liberia que es serial_port.cs , esta es la base de nuestro software es quien escuchara en el puerto determinado, previamente configurado antes de compilar software, la idea es que mas adelante el software detecte los puertos eriales habilitados y los muestre y así podamos escoger el puerto y su configuración.El puerto esta configurado para estas prueba con la siguiente configuración:


Descripción                  Valor

Nombre puerto             /dev/ttyUSB0
Velocidad                     9600
Parity                            Parity.None
Data Bits                      8
Stop Bit                        StopBits.Two

Aplicando lo anteriormente explicado nuestro código que manejara el puerto serial quedaría así:



using System;
using System.IO.Ports;
using System.IO;
using System.Collections.Generic;
 
namespace kenport
{
    public class serial_port
    {
 
        private SerialPort mySerial;
 
        // Constructor
        public serial_port ()
        {
        }
 
        public void Test ()
        {
            if (mySerial != null)
                if (mySerial.IsOpen)
                    mySerial.Close ();
 
            mySerial = new SerialPort ("/dev/ttyUSB0", 9600, Parity.None, 8, StopBits.Two );
            mySerial.Open ();
            mySerial.ReadTimeout = 400;
 
            while (true) {
                Console.WriteLine (ReadData ());
                // Hook a write to the text file.
                StreamWriter writer = new StreamWriter ("/home/luiswisp/archivo.txt", true);
                // Rewrite the entire value of s to the file
                string a = ReadData ();
                writer.WriteLine (a);
                // Close the writer
                writer.Close ();
            }
        }
 
        public string ReadData ()
        {
            byte tmpByte;
            string rxString = "";
 
            try {
 
                tmpByte = (byte)mySerial.ReadByte ();
 
                while (true) {
                    //Console.WriteLine("Data Received");
                    try {
                        rxString += ((char)tmpByte);
                        tmpByte = (byte)mySerial.ReadByte ();
                    } catch {
                        rxString += "!2";
                        break;
                    }
                }
 
            } catch {
                rxString += "!1";
            }
            return rxString;
        }
 
        public bool SendData (string Data)
        {
            mySerial.Write (Data);
            return true;
        }
 
    }
} 

Ahora que tenemos los tres archivos necesarios para implementar nuestro primer modulo en Mono C# en linux. ahora debes compilar y ejecutar la aplicación. 


No hay comentarios :

Publicar un comentario