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.EventArgs) Handles 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.EventArgs) Handles 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.EventArgs) Handles 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.EventArgs) Handles 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,