Hallo!
Du greifst per "Form1" offenbar auf die Defaultinstanz des
Formulars zu. Allem Anschein nach ist das nicht die Instanz der
Form-Klasse, deren Textbox Du ansprechen möchtest.
Es gibt diverse Grundregeln im OOP.
Eine lautet sinngemäß, daß Klassen per Methodenaufruf mit untergeordneten
Klassen kommunizieren und die untergeordneten Klassen Ereignisse
verwenden, um Informationen zu liefern.
Man sollte NIE von außen auf Controls eines Formulars zugreifen.
Deine Com-Klasse sollte deshalb so oder ähnlich konstruiert werden:
Option Strict On : Option Explicit On
Imports System.IO.Ports
Imports System.Threading
Public Class Class_COM
Private WithEvents _serialPort As SerialPort
Public Event ComStateChanged(ByVal sender As Object, e As EventArgs)
Public Event Datareceived(ByVal sender As Object, data As String)
Public Function OpenCom(ByVal Comport As String) As Boolean
_serialPort = New SerialPort
_serialPort.PortName = "COM2"
_serialPort.BaudRate = 115200
_serialPort.Parity = 0
_serialPort.DataBits = 8
_serialPort.StopBits = StopBits.One
_serialPort.RtsEnable = True
_serialPort.DtrEnable = True
_serialPort.Handshake = 0
_serialPort.ReadTimeout = 500
_serialPort.WriteTimeout = 500
Try
_serialPort.Open()
If _serialPort.IsOpen Then
RaiseEvent ComStateChanged(Me, EventArgs.Empty)
End If
Return _serialPort.IsOpen
Catch ex As Exception
Return False
End Try
End Function
Public Function WriteCom(ByVal message As String) As Boolean
Try
_serialPort.WriteLine(message)
Return True
Catch
Return False
End Try
End Function
Public Function CloseCom() As Boolean
Try
_serialPort.Close()
RaiseEvent ComStateChanged(Me, EventArgs.Empty)
Return True
Catch
Return False
End Try
End Function
Public Function comstatus() As Boolean
Return _serialPort.IsOpen
End Function
Private Sub DataReceivedHandler(sender As Object, e As _
SerialDataReceivedEventArgs) Handles _serialPort.DataReceived
Dim sp As SerialPort = CType(sender, SerialPort)
Dim indata As String = sp.ReadExisting()
RaiseEvent Datareceived(Me, indata)
End Sub
End Class Im Formular werden die Ereignisse verarbeitet. Etwa so ...
Public Class frmCom
Dim WithEvents myCom As New Class_COM
Dim WithEvents btnSenden As New Button _
With {.Parent = Me, .Text = "Senden"}
Dim txtState As New TextBox _
With {.Parent = Me, .Top = 50}
Dim txtData As New TextBox _
With {.Parent = Me, .Top = 100}
Private Sub frmCom_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
If Not myCom.OpenCom("xxxx") Then
MsgBox("Port kann nicht geöffnet werden")
End If
End Sub
Private Sub mycom_ComStateChanged(sender As Object, _
e As System.EventArgs) Handles myCom.ComStateChanged
txtState.Text = If(myCom.comstatus, "Open", "Close")
End Sub
Private Sub mycom_Datareceived(sender As Object, _
data As String) Handles myCom.Datareceived
txtData.Text = data
End Sub
Private Sub btnSenden_Click(sender As Object, _
e As System.EventArgs) Handles btnSenden.Click
myCom.WriteCom("XXX")
End Sub
End Class |