So,
dank euch habe ich zwei neu Lösungen für mein Problem
und auch gleich ein paar neu Fragen
Hier erstmal die Lösung nach Preisser und Manni01:
Private Sub verbinden_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles verbinden.Click
With SerialPort1
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()
verbinden.BackColor = Color.Green
verbinden.Text = "Verbunden"
Catch ex As Exception
MessageBox.Show(ex.Message, "Fehler beim Open", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End Try
End If
End With
End Sub
Private Sub Start_Click(sender As System.Object, e As System.EventArgs) _
Handles Start.Click
Dim start As New ParameterizedThreadStart(AddressOf ReadSerialPort)
Dim empfangen As New Thread(start)
empfangen.Start(SerialPort1)
End Sub
Private Sub ReadSerialPort(port As 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 = port.Read(head_array, headBytesRead, ( _
head_array.Length - headBytesRead))
headBytesRead += read
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 = port.Read(body_array, bodyBytesRead, _
parameterlänge - bodyBytesRead)
bodyBytesRead += read
End While
If Checksumme(head_array, body_array) = False Then
MsgBox("nicht ok")
port.DiscardInBuffer()
Else
'GUI-Thread benachrichtigen, dass Telegramm empfangen wurde
BeginInvoke(New Action(Of Byte(), Byte())(AddressOf _
TelegramEmpfangen), head_array, body_array)
End If
Else
port.DiscardInBuffer()
End If
Loop
End Sub
Function Checksumme(ByVal Hader_Daten As Array, ByVal Body_Daten As Array) As _
Boolean
Dim summe As Integer = 0
For zähler As Integer = 2 To 6
summe = summe + (Hader_Daten(zähler))
Next
For zähler As Integer = 0 To Body_Daten.Length - 2
summe = summe + (Body_Daten(zähler))
Next
summe = summe Mod 256
If summe = 255 Then summe = 0
If Body_Daten(Body_Daten.Length - 1) = summe Then
Checksumme = True
Else
Checksumme = False
End If
End Function
'Wird im GUI-Thread aufgerufen, wenn Telegramm empfangen wurde
Private Sub TelegramEmpfangen(head As Byte(), body As Byte())
empfänger += 1
TextBox1.Text = empfänger
End Sub |