Dim WithEvents BGW As New System.ComponentModel.BackgroundWorker With _
{.WorkerReportsProgress = True, .WorkerSupportsCancellation = True} _
' BackgroundWorker deklarieren
Private Sub verbinden_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles verbinden.Click
With SerialPort1
If verbinden.Text = "Verbinden" Then
If Not .IsOpen Then
Try
.PortName = ComboBox1.Text
.BaudRate = 38400
.DataBits = 8
.Parity = Parity.None
.StopBits = StopBits.One
.WriteTimeout = 1000 ' 1000 ms = 1 Sek.
'.ReadTimeout = 1000 ' 1000 ms = 1 Sek.
.Open()
Catch ex As Exception
MessageBox.Show(ex.Message, "Fehler beim Open", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End Try
End If
If Not BGW.IsBusy Then 'wenn BackgroundWorker aus -> Starten
BGW.RunWorkerAsync(SerialPort1)
End If
verbinden.BackColor = Color.Green
verbinden.Text = "Verbunden"
Else 'Verbindung abbrechen
If BGW.IsBusy Then 'wenn BackgroundWorker an
BGW.CancelAsync() 'BackgroundWorker abbrechen
End If
verbinden.BackColor = Color.Red
verbinden.Text = "Verbinden"
End If
End With
End Sub
Private Sub BGW_DoWork(sender As Object, e As _
System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork
'SerialPort lesen
Do
' 7 Bytes Head lesen
Dim head_array As Byte() = New Byte(6) {}
Dim headBytesRead As Integer = 0
While headBytesRead < head_array.Length
Dim read As Integer = e.Argument.Read(head_array, _
headBytesRead, (head_array.Length - headBytesRead))
headBytesRead += read
If BGW.CancellationPending Then 'BackgroundWorker
' abbrechen
Exit Do
End If
End While
If head_array(0) = &HFF And head_array(1) = &H30 And head_array(2) _
= &H1 Then
Dim parameterlänge As Integer = (head_array(4) * 255) + _
head_array(5) + 1
Dim body_array As Byte() = New Byte(parameterlänge - 1) {}
Dim bodyBytesRead As Integer = 0
While bodyBytesRead < parameterlänge
Dim read As Integer = e.Argument.Read(body_array, _
bodyBytesRead, parameterlänge - bodyBytesRead)
bodyBytesRead += read
If BGW.CancellationPending Then 'BackgroundWorker
' abbrechen
Exit Do
End If
End While
If Checksumme(head_array, body_array) = False Then
MsgBox("nicht ok")
e.Argument.DiscardInBuffer()
Else
'Daten an Form geben
BGW.ReportProgress(Nothing, New BGWUserState With _
{.BGW_head_array = head_array, .BGW_body_array = _
body_array})
End If
Else
e.Argument.DiscardInBuffer()
End If
Loop
End Sub
Class BGWUserState
Public BGW_head_array() As Byte
Public BGW_body_array() As Byte
End Class
Private Sub BGW_ProgressChanged(sender As Object, e As _
System.ComponentModel.ProgressChangedEventArgs) Handles _
BGW.ProgressChanged
Dim UserState As BGWUserState = DirectCast(e.UserState, BGWUserState)
If UserState.BGW_head_array(0) = 255 Then
empfänger += 1
TextBox1.Text = empfänger
End If
End Sub
Private Sub BGW_RunWorkerCompleted(sender As Object, e As _
System.ComponentModel.RunWorkerCompletedEventArgs) Handles _
BGW.RunWorkerCompleted
SerialPort1.DiscardInBuffer()
SerialPort1.Close()
' MsgBox("BGW abgebrochen")
End Sub
Function Checksumme(ByVal Hader_Daten As Array, ByVal Body_Daten As Array) As _
Boolean
...
End Function Die Frage könnt Ihr euch bestimmt schon denken
wo liegen die Vor und Nachteile der beiden Metoden, wann wendet man welche an?
Leider habe ich nichts gefunden was mir meine Fragen beantwortet, daher hoffe ich das Ihr kurz was dazu sagen könnt.
Ach ja verbesserungs Vorschläge zum Code sind immer herzlich willkommen.
gruß
Matthias |