Hallo liebes Forum,
ich schlage mich seit mehreren Tagen mit folgendenm Problem herum:
in Me.Shown werden nacheinander insgesamt 6 serielle Schnittstellen abgefragt, jeweils in getrennten Subs. Die letzte Schnittstelle muss ein binäres Protokoll senden (16 Bytes). Dieses Write wird einfach übersprungen (jedenfalls stellt es sich so dar.
Die Prozedur für die Aufrufe:
"Check_for_Pads" und "Check_for_Relais" klappt einwandfrei. Aber bei der nächsten wird die Funktion "WriteBuffer" nicht ausgeführt.
Die Funktion WriteBuffer
Ich bin echt am Verzweifeln. Kann mi irgendjemand sagen, warum beim Durchsteppen alles klappt, wenn ich einen Breakpoint vor den Write-Befehl setze alles klappt --- nur beim normalen Ablauf wird dem BoardPort nichts zugewiesen???
Bin für jede Hilfe dankbar!
ich schlage mich seit mehreren Tagen mit folgendenm Problem herum:
in Me.Shown werden nacheinander insgesamt 6 serielle Schnittstellen abgefragt, jeweils in getrennten Subs. Die letzte Schnittstelle muss ein binäres Protokoll senden (16 Bytes). Dieses Write wird einfach übersprungen (jedenfalls stellt es sich so dar.
Die Prozedur für die Aufrufe:
VB.NET-Quellcode
- Private Sub frmBohle_Shown(sender As Object, e As EventArgs) Handles Me.Shown
- With frmMain.ProgressBar
- .Visible = True
- Check_for_Pads() 'überprüft, ob Pad 1-3 angeschlossen ist
- .Value = 66
- Check_for_Relais() 'ermittelt den Port des USB-Relais
- .Value = 83
- Check_for_Board() 'überprüft, ob ein Jury-board angeschlossen ist
- .Value = 95
- COM_Init()
- .Value = 100
- uPorts.Clear()
- .Visible = False
- End With
- Try
- frmMain.Cursor = Cursors.Default
- Catch ex As Exception
- End Try
- End Sub
"Check_for_Pads" und "Check_for_Relais" klappt einwandfrei. Aber bei der nächsten wird die Funktion "WriteBuffer" nicht ausgeführt.
VB.NET-Quellcode
- Private Sub Check_for_Board()
- Dim ports As String() = SerialPort.GetPortNames()
- Dim NoBoard As Boolean
- Dim myPort As New SerialPort
- With myPort
- For c As Integer = 0 To ports.Count - 1
- If Not uPorts.ContainsKey(ports(c)) Then
- NoBoard = False
- ReDim buf(15)
- Try
- If .IsOpen Then .Close()
- .PortName = ports(c)
- .BaudRate = 9600
- .Parity = Parity.None
- .DataBits = 8
- .StopBits = StopBits.One
- .Handshake = Handshake.None
- .ParityReplace = 63
- .ReceivedBytesThreshold = 1
- .ReadTimeout = 500
- .RtsEnable = False
- .WriteTimeout = 500
- .ReadBufferSize = 4096
- .WriteBufferSize = 2048
- .Open()
- Catch ex As Exception
- NoBoard = True
- End Try
- If Not NoBoard Then
- Try
- If WriteBuffer(myPort, buf) Then
- Dim ch() As Char = myPort.ReadExisting().ToCharArray
- For i = LBound(ch) To UBound(ch)
- Select Case ch(i)
- Case CChar("F")
- With BoardPort
- If .IsOpen Then .Close()
- .PortName = ports(c)
- .BaudRate = 9600
- .Parity = Parity.None
- .DataBits = 8
- .StopBits = StopBits.One
- .Handshake = Handshake.None
- .ParityReplace = 63
- .ReceivedBytesThreshold = 1
- .ReadTimeout = 500
- .RtsEnable = False
- .WriteTimeout = 500
- .ReadBufferSize = 4096
- .WriteBufferSize = 2048
- End With
- uPorts.Add(ports(c), 500)
- Exit For
- End Select
- Next
- Else
- NoBoard = True
- End If
- Catch ex As Exception
- NoBoard = True
- End Try
- End If
- End If
- Next
- .Dispose()
- End With
- End Sub
Die Funktion WriteBuffer
VB.NET-Quellcode
- Private Function WriteBuffer(port As SerialPort, buf() As Byte) As Boolean
- Dim success As Boolean = True
- Dim CRC As Long = 65535 'Anfangswert für die CRC laden
- For x As Integer = 0 To 12 'CRC geht über alle 12 Datenbytes
- CRC = CRC Xor buf(CInt(x)) 'Aktuelles Datenbyte in die CRC-einbeziehen
- For y As Integer = 1 To 8 'Acht Runden schieben und XOR-en
- If (CRC Mod 2) > 0 Then
- CRC = CLng((CRC And 65534) / 2)
- CRC = CRC Xor 40961 'Polynom der CRC 0xA001 in dezimal ausgedrückt
- Else
- CRC = CLng((CRC And 65534) / 2)
- End If
- Next
- Next
- 'Die beiden CRC-Bytes werden an die Nachricht angehängt
- buf(13) = CByte((CRC And 65280) / 256)
- buf(14) = CByte(CRC And 255)
- Try
- Threading.Thread.Sleep(100)
- port.Write(buf, 0, 15) 'Gesamtes Paket absenden
- Catch ex As Exception
- success = False
- End Try
- Return success
- End Function
Ich bin echt am Verzweifeln. Kann mi irgendjemand sagen, warum beim Durchsteppen alles klappt, wenn ich einen Breakpoint vor den Write-Befehl setze alles klappt --- nur beim normalen Ablauf wird dem BoardPort nichts zugewiesen???
Bin für jede Hilfe dankbar!