Como declarar el puerto serie de forma Global

Respondiendo una pregunta de los foros, me complace compartir con vosotros el siguiente ejercicio; no sin antes puntualizar que se trata de la puesta en escena de un ejemplo que utilizaría un modulo como “clase estática” donde depositar objetos compartidos dentro de nuestro espacio de aplicación.


Para evitar interpretaciones, este es uno de esos ejemplos que no debe considerarse “modelo” pues su escenario es poco menos que atípico, aclarar que en situaciones similares lo adecuado seria diseñar una clase completa con toda la funcionalidad y acceso, para posteriormente incluirla como propiedad en un modulo. La dificultad se encuentra en la cantidad de código que deberíamos desplegar para realizar una explicación que finalmente terminaría siendo compleja de seguir y entender.


Dicho esto, el siguiente es solo un punto de entrada para las personas que intentan iniciarse en el tema y se encuentran en situaciones como la que expone “Caudiz” en los foros… necesita poder acceder al puerto serie desde dos forms diferentes.


Primero definiríamos el modulo que contendrá toda la lógica de acceso al puerto serie y podría ser algo similar a lo que sigue :


Imports System.IO.Ports
 
Module SerialComm
 
    Private SerialPort1 As New SerialPort
    Private LastFrameRead As String
 
    Public Event DataAvailable()
 
    Sub New()
        SerialPort1.PortName = "COMx"
        SerialPort1.Open()
        AddHandler SerialPort1.DataReceived, AddressOf ReceiveData
    End Sub
 
    Private Sub ReceiveData()
        LastFrameRead += SerialPort1.ReadExisting.ToString()
        RaiseEvent DataAvailable()
    End Sub
 
    Public Function ReadData() As String
        Return LastFrameRead
    End Function
 
    Public Sub WriteData(Frame)
        SerialPort1.Write(Frame)
    End Sub
 
    Public Sub ClearData()
        LastFrameRead = ""
    End Sub
 
End Module

Finalmente incluiríamos el siguiente código para acceder a dicha funcionalidad en este caso desde el ‘Form1’ aunque evidentemente podemos incluirlo desde cualquier otro punto del espacio de nuestra aplicación.


Public Class Form1
 
    Sub Form1_Load(sender As System.Object, e As System.EventArgsHandles MyBase.Load
        AddHandler SerialComm.DataAvailable, AddressOf ReadData
        Form2.Show()
    End Sub
 
    Sub ReadData()
        Me.Label1.Text = SerialComm.ReadData
    End Sub
 
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgsHandles Button1.Click
        SerialComm.WriteData("Hola :-) from 1")
    End Sub
End Class

Public Class Form2
 
    Private Sub Form2_Load(sender As System.Object, e As System.EventArgsHandles MyBase.Load
        AddHandler SerialComm.DataAvailable, AddressOf ReadData
    End Sub
 
    Sub ReadData()
        Me.Label1.Text = SerialComm.ReadData
    End Sub
 
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgsHandles Button1.Click
        SerialComm.WriteData("Hola :-) from 2")
    End Sub
 
End Class

Espero vuestros comentarios y que a partir de esta idea, podáis construir de forma robusta la implementación de vuestra solucion.
Saludos,
PepLluis,

3 thoughts on “Como declarar el puerto serie de forma Global”

  1. antes que nada gracias por tu tiempo y pues Me gustaria saber de donde sale la variable SerialComm y el metodo ReadData ya que me aparecen que ni esta declarada y que no hay tal metodo, de antemano gracias :D

  2. Hola,
    SerialCom hace referencia al espacio del modulo donde se define el ‘SerialPort1′.

    SerialCom es el nombre de la clase, que ademas contiene las funciones pubilicas que puedes invocar desde cada form… SerialCom.ReadData devuelve la ultima trama recibida por el SerialPort1, que esta en el modulo ‘SerialCom’.

    Saludos,
    PepLluis,

  3. Que tal use este ejemplo para contrilar un puerto serial solo que cuando corro mi aplicacion me manda este error y no se como se corige

    The I/O operation has been aborted because of either a thread exit or an application request
    hay alguien que me pueda ayudar por favor.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>