Hallo zusammen
ich bin gerade bei meiner Projektarbeit und hänge total.
Ich habe vor, einen Lasersensor über RS232 auszulesen.
Die ersten Versuche waren auch erfolgreich. Doch jetzt hänge ich bei dem
Problem mit den unterscheidlichen Threads fest.
Ich habe eine Klasse clsLaser programmiert. Sobalt diese Klasse instanziert wird,
wird der ComPort geöffnet und der Laser ist bereit. ... so weit so gut ...
Um die ausgelesene Daten von der Sub "serial_DataReceived" nutzen zu können muss ich diese irgendwie
vom Workerthread auf den Hauptthread bekommen. Soweit ich das gelesene Verstanden habe, habe ich versucht es umzusetzen. Leider ohne Erfolg.
Mein Ziel war es, bei Ankunft neuer Daten ein Event auszulösen, das im Hauptthread läuft.
Aber leider funktioniert diese , im Projekt auskommentierte, Zeile nicht:
Me.Invoke(New ValueDelegate(AddressOf xxxx), New Object() {pMaxEdge, _
pMinEdge}) Hat jemand evtl. einen Tipp für mich?
mfg
Matthias
Public Class clsLaser
Public WithEvents serial As System.IO.Ports.SerialPort
Dim readBuffer(36) As Byte
Dim pMaxEdge As Integer
Dim pMinEdge As Integer
Private Delegate Sub ValueDelegate(ByVal MaxEdge As Integer, ByVal MinEdge _
As Integer)
Sub New(ByVal pComPort As String)
serial = New System.IO.Ports.SerialPort
serial.PortName = pComPort
serial.Parity = IO.Ports.Parity.None
serial.BaudRate = 19200
serial.WriteBufferSize = 36
serial.ReadBufferSize = 36
serial.ReceivedBytesThreshold = 36
serial.Open()
End Sub
Public Sub ReadEdges()
serial.Write(Chr(0) & Chr(85) & Chr(0) & Chr(8) & Chr(0) & Chr(0) & Chr( _
0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & _
Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) _
& Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr( _
0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0))
End Sub
Public Sub LaserReset()
serial.Write(Chr(0) & Chr(85) & Chr(0) & Chr(11) & Chr(0) & Chr(0) & _
Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) _
& Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr( _
0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & _
Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0))
End Sub
Private Sub serial_DataReceived(ByVal sender As Object, ByVal e As _
System.IO.Ports.SerialDataReceivedEventArgs) Handles serial.DataReceived
serial.Read(readBuffer, 1, 36)
If readBuffer(4) = 8 Then
pMaxEdge = ByteToInt(readBuffer(27), readBuffer(28))
pMinEdge = ByteToInt(readBuffer(29), readBuffer(30))
' Me.Invoke(New ValueDelegate(AddressOf xxxx), New Object()
' {pMaxEdge, pMinEdge})
End If
serial.DiscardInBuffer()
End Sub
Private Function ByteToInt(ByVal pElement1 As Byte, ByVal pElement2 As _
Byte) As Integer
Return (Convert.ToInt32(Hex(pElement1).PadLeft(2, CChar("0")) & (Hex( _
pElement2).PadLeft(2, CChar("0"))).ToString, 16))
End Function
Private Sub xxxx(ByVal MaxEdge As Integer, ByVal MinEdge As Integer)
RaiseEvent NewEdgeValue(pMaxEdge, pMinEdge)
End Sub
Event NewEdgeValue(ByVal MaxEdge As Integer, ByVal MinEdge As Integer)
End Class |