Saludos, soy un tanto nuevo en programación, estoy trabajando con puertos seriales y tengo la siguiente duda:
¿ Como podría hacer uso del método SerialDataReceivedEventHandler(DataReceivedHandler ) desde otra clase ? ya que lo he estado intentando y al parecer este evento no se ejecuta, me explico: creé un clase que funciona como controlador del puerto serial (ControladorSerial), ésta es utilizada por una clase principal (Program)cuya utilidad es mostrar los datos capturados en consola, he verificado y el evento SerialDataReceivedEventHandler no es disparado cuando la clase ControladorSerial es utilazada (referenciada) por mi clase principal.
Sin embargo cree una aplicación de consola y utilicé este método en la clase principal de la consola (program.cs) y funciona perfecto, lee los datos del puerto serial.
Si alguien ayudarme a solucionar este problema se lo agradecería enormemente.
Clase controlador puerto serial
Código:
namespace ConsoleApplication1
{
class ControladorSerial
{
/*
* Declaración de variables
* */
//Interfaz Serial
private static SerialPort puertoSerial;
//Variables de velocidad y nivel de giro
private static int DIR_VERTICAL;
private static int DIR_HORIZONTAL;
public static bool estate;
public static int GET_DIR_VERTICAL
{
get { return ControladorSerial.DIR_VERTICAL; }
set { ControladorSerial.DIR_VERTICAL = value; }
}
public static int GET_DIR_HORIZONTAL
{
get { return ControladorSerial.DIR_HORIZONTAL; }
set { ControladorSerial.DIR_HORIZONTAL = value; }
}
/*
* Método que inicializa el purto COM
* */
public static void InitSerialInterface(string puerto, int baudios)
{
puertoSerial = new SerialPort(puerto,baudios);
puertoSerial.DtrEnable = true;
try
{
puertoSerial.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
puertoSerial.Open();
puertoSerial.ReadTimeout = 5;
}
catch(Exception e)
{
throw new Exception("Se ha producido el siguiente error:"+e.Message);
}
}
public static string cerrarpuerto()
{
try
{
puertoSerial.Close();
return "Puerto cerrado correctmente";
}
catch(Exception ex)
{
return "ADVERTENCIA: "+ex.Message.ToString();
}
}
/*
* Método DataReceivedHandler
* Representa el método que controlará los datos recibidos del objeto SerialPort
* */
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
estate = true;
SerialPort puertoSerial = (SerialPort)sender;
string indata = puertoSerial.ReadExisting();
string CadenaFormateada = indata.ToString().Trim();
if (CadenaFormateada.Length == 7)
{
//Asigna los valores capturados del puerto COM
DIR_VERTICAL = int.Parse(CadenaFormateada.Substring(0, 3));
DIR_HORIZONTAL = int.Parse(CadenaFormateada.Substring(4, 3));
}
}
}
}
Clase Principal
Código:
namespace ConsoleApplication1
{
class Program
{
private static int DIR_VERTICAL;
private static int DIR_HORIZONTAL;
static void Main(string[] args)
{
Console.WriteLine("************* ACCESO A DATOS SERIALES *****************");
Console.WriteLine("\n");
Console.WriteLine("*****PRESIONE CUALQUIER TECLA PARA CONTINUAR*****");
Console.WriteLine("\n");
//Utilizamos la clase que controla nuestro puerto com
ControladorSerial.InitSerialInterface("COM7",9600);
DIR_VERTICAL = ControladorSerial.GET_DIR_VERTICAL;
DIR_HORIZONTAL = ControladorSerial.GET_DIR_HORIZONTAL;
Console.WriteLine("DIRECCION VERTCAL: "+ DIR_VERTICAL);
Console.WriteLine("DIRECCION VERTCAL: " + DIR_HORIZONTAL);
Console.ReadLine();
}
}
}