#Region " Imports "
Imports System.IO.Ports
#End Region
Public NotInheritable Class Form1 : Inherits Form
#Region " Objects / Constants-ReadOnly / Properties "
' Estos objetos los inicializo en el constructor del Form solo para poder compilar este ejemplo.
Private WithEvents sp As SerialPort
Private ReadOnly ss As StatusStrip
Private ReadOnly tb As TextBox
' ***********************************************
Private WithEvents tmr As New Timer
Private ReadOnly charStx As Char = Convert.ToChar(&H1)
Private ReadOnly charEtx As Char = Convert.ToChar(&H3)
Private ReadOnly charEot As Char = Convert.ToChar(&H4)
Private ReadOnly charEnq As Char = Convert.ToChar(&H5)
Private ReadOnly charAck As Char = Convert.ToChar(&H6)
''' <summary>
''' Gets the next character from the device's input buffer.
''' </summary>
''' <value>The next character from the device's input buffer.</value>
Private ReadOnly Property NextChar As Char
Get
Return Convert.ToChar(Me.sp.ReadChar)
End Get
End Property
#End Region
#Region " Constructors "
Public Sub New(ByVal sp As SerialPort, ByVal ss As StatusStrip, ByVal tb As TextBox)
MyClass.InitializeComponent()
Me.sp = sp
Me.ss = ss
Me.tb = tb
End Sub
Public Sub New()
MyClass.InitializeComponent()
End Sub
#End Region
#Region " Event-Handlers "
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
Handles Me.Load
Me.OpenPort(Me.sp)
End Sub
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) _
Handles Me.FormClosing
Me.ClosePort(Me.sp)
End Sub
Private Sub Serialport1_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) _
Handles sp.DataReceived
Me.ProcessChar(Me.NextChar)
End Sub
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) _
Handles tmr.Tick
ss.Items(0).Text = DateTime.Now.ToLongTimeString
End Sub
#End Region
#Region " Private Methods "
Private Sub OpenPort(ByVal sp As SerialPort)
If Not sp.IsOpen Then
Try
sp.Open()
Catch ex As Exception
MessageBox.Show(ex.ToString &
Environment.NewLine &
ex.StackTrace, "error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End If
End Sub
Private Sub ClosePort(ByVal sp As SerialPort)
If sp.IsOpen Then
Try
sp.Close()
Catch ex As Exception
MessageBox.Show(ex.ToString &
Environment.NewLine &
ex.StackTrace, "error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
If sp IsNot Nothing Then
sp.Dispose()
End If
End Try
End If
End Sub
Private Sub ProcessChar(ByVal chr As Char)
Select Case chr
Case Me.charStx, Me.charEnq, Me.charEtx
sp.Write(Me.charAck)
Case Me.charAck
' Do Nothing?.
Case Me.charEot
Me.ThreadSafeAppendText(Me.tb, chr & ControlChars.Lf)
Case Else
Me.ThreadSafeAppendText(Me.tb, chr)
End Select
End Sub
Private Sub ThreadSafeAppendText(ByVal tb As TextBox, ByVal str As String)
SyncLock tb
If tb.InvokeRequired Then
tb.Invoke(Sub() tb.AppendText(str))
Else
tb.AppendText(str)
End If
End SyncLock
End Sub
#End Region
End Class