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,
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 😀
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,
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.