Serial Port und WithEvents Variabel

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von fraju.

    Serial Port und WithEvents Variabel

    Hallo!

    Ich versuche gerade Daten auf eine Waage mit RS232 zu lesen.

    Ich lese die datein durch dem COMPort befehl. Das problem ist, dass ich will die einstellungen von den Waage in eine zweite formular haben und in der hauptfenster will ich nur die Daten schreiben. Die Probleme kommt bei den Daten auszulessen.

    Also ich habe auf ein Modul

    VB.NET-Quellcode

    1. Public WithEvents COMPort As New SerialPort definiert.


    die Variable wird soweit Global betrachtet, außer an eine stelle:

    VB.NET-Quellcode

    1. Private Sub Receiver(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles COMPort.DataReceived
    2. 'Note this subroutine is executed on the serial port thread - not the UI thread.
    3. Dim RXByte As Byte
    4. Dim RXArray(2047) As Char
    5. Dim I As Integer = 0
    6. Do
    7. RXByte = COMPort.ReadByte
    8. RXArray(I) = Chr(RXByte) 'schreibt ausgelesene daten ins fenster
    9. I = I + 1
    10. 'RXArray(I) = " " ' sorgt dafür das immer eine leerstelle eingeführt wird
    11. 'I = I + 1
    12. Loop Until (COMPort.BytesToRead = 0)
    13. Dim RxString As New String(RXArray, 0, I) ' Convert the first part of the Char Array to a String
    14. ' Put a message with a delegate, which points to the display routine and holds the RxString,
    15. ' on the message queue and return immediately.
    16. Me.BeginInvoke(New StringSubPointer(AddressOf Display), RxString) 'Hier gehts zu den Unterfunktion Display
    17. End Sub



    Diese bringt mir die Folgende Fehler

    Fehler 1
    Die Handles-Klausel erfordert eine WithEvents-Variable, die im enthaltenden Typ oder einem seiner Basistypen definiert wird.
    :pinch:

    Obwohl ich die Variabel schon als WithEvents deklariert habe.

    Ich habe in Internet nach lösungen gesucht, finde leider nichts. :(
    Wenn jemand mich Helfen könnte wurde ich mich sehr freuen!! Da ich den Programm schnell fertig haben muss!!! ;(
    Vielen Dank für Ihre antwort!

    Wenn ich die einstellungen der Waage auf den gleiche formular wie den Comport.DateReceived gehabt habe (Variable deklaration war auch auf den gleiche formular) war die loop kein Problem, hat fehlerfrei funktioniert.
    Hage ich trotzdem jetzt ohne der loop probiert und bekomme ich immer noch die Fehlermeldung. :S
    Wieviel Byte ließt du denn ein ,bis ein Event ausgelöst wird?

    Deklariere das Array Global.

    dann kannst du das Array von der Form2 auslesen.
    Du kannst auch das Array mit einem Timer auslesen und übergeben wohin du willst.
    Wie sieht den dein Code jetzt aus.

    Gruß
    Hallo! Vielen Dank für die schnelle Antwort!! Ich lese jedes mal 18 Bits von der Waage, die Array Global zu deklarieren hat leider nichts geholfen

    Mit ein Timer (jeder 1000s) sende ich ständig eine signal zu den waage, so dass die waage mir den signal züruck schieckt:

    VB.NET-Quellcode

    1. If COMPort.IsOpen Then
    2. COMPort.Write("s")
    3. COMPort.Write(Chr(&HD))
    4. TextBox4.Text = "COMPort ist offen"
    5. Else
    6. TextBox4.Text = "COMPort ist closed"
    7. End If


    Und dann sollte die werte von den Programm der die fehlermeldung bringt auf eine textfeld einschreiben.
    Ich galube nicht dass die Problem an den code liegt, weil es hat vorher funktioniert, wenn ich die deklariation con den COMPort auf dem gleiche formular gehabt habe. ?(

    Ich habe auch versuch statt mit den DateReceived die code auf eine Button zu bringen, dass den signal ausgelesen wird wenn die button bestätigt wird, aber so hat nut die erste 2 werte ausgelesen und nicht mehr. Habe ich versuch dass es ständig mit eine do while loop die Array die werte ausliest, aber dann bleibt den computer immer hängen... 8|
    Diese ist die Empfangsroutine... wobei die fehler bei der COMPort.DataReceived auftriit, wird die COMPort deklaration nihct erkannt...

    VB.NET-Quellcode

    1. Public WithEvents COMPort As New SerialPort
    diese Dekaration wird auf ein Modul deklariert.

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO.Ports
    3. Imports System.Threading.Thread


    VB.NET-Quellcode

    1. Private Sub Receiver(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles COMPort.DataReceived
    2. ' 'Note this subroutine is executed on the serial port thread - not the UI thread.
    3. Dim RXByte As Byte
    4. Dim RXArray(2047) As Char
    5. Dim I As Integer = 0
    6. Do
    7. RXByte = COMPort.ReadByte
    8. RXArray(I) = Chr(RXByte) 'schreibt ausgelesene daten ins fenster
    9. I = I + 1
    10. 'RXArray(I) = " " ' sorgt dafür das immer eine leerstelle eingeführt wird
    11. 'I = I + 1
    12. Loop Until (COMPort.BytesToRead = 0)
    13. Dim RxString As New String(RXArray, 0, I) ' Convert the first part of the Char Array to a String
    14. ' Put a message with a delegate, which points to the display routine and holds the RxString,
    15. ' on the message queue and return immediately.
    16. Me.BeginInvoke(New StringSubPointer(AddressOf Display), RxString) 'Hier gehts zu den Unterfunktion Display
    17. End Sub





    von hier wird geschiekct zu den unterprogramm (diese unterprogramm funktioniert)


    VB.NET-Quellcode

    1. Private Sub Display(ByVal Buffer As String)
    2. 'Diese Unterprogramm sorgt dafür, dass die respektive Gewicht vergleich gemacht wird, und die bewegung des Motors.
    3. 'In diese schleife wird die textbox1 geleert, das die aktuelle wert geschrieben werden kann.
    4. If bitzaehler = 18 Then
    5. TextBox1.Text = ""
    6. bitzaehler = 0
    7. End If
    8. Received.AppendText(Buffer)
    9. TextBox1.AppendText(Buffer)
    10. bitzaehler = bitzaehler + 1
    11. Dim istgewicht As Double
    12. istgewicht = Val(TextBox1.Text)
    13. If istgewicht < oberegrenze1 And istgewicht > unteregrenze1 And schritt = 0 Then
    14. 'ergebniss1.Text = "Richtig"
    15. ergebniss1.Text = istgewicht
    16. schritt = 1
    17. If cb1 = 1 Then
    18. TextBox6.Text = "motor bewegen"
    19. ''Motor bewegen
    20. End If
    21. End sub


    Gruß
    ..deine Aufgabe Einfach gesagt.

    Du sendest "s"+&HD damit deine Wage 18 Byte zurücksendet.
    Das letzte Byte ist "Null"

    Stelle deinen Empfangspuffer groß genug ein.
    ReceiverdBytesThreshold richtig eingestellt.

    Edit: Dim RXByte As Byte
    Dim RXArray(2047) As Char
    Dim I As Integer = 0

    Das wird jedesmal neu Deklariert,bei Empfang.

    Gruß

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „fraju“ ()

    also ich habe bis jetzt keine ReceivedBytesThreshold deklariert.
    ich habe jetzt in der Hilfe nachgelesen und steht ich soll es deklariert

    Public Property ReceivedBytesThreshold() As Integer, abver es erwarte ein argument in den klammern, und sorra dass ich alles nachfrage aber ich kenne mich woirklich nicht so gut aus un weisse ich nicht wass ich da kommt.

    wie kann ich die Empfanspuffer eichtig einstellen??
    Die SendeRoutine ist für ByteAusgabe gedacht.
    Experimentiere damit.

    VB.NET-Quellcode

    1. Imports System.Text ' <=== ! nicht vergessen
    2. Sub SendSerialData02(ByVal data As String)
    3. Dim enc As Encoding = Encoding.GetEncoding(1252)
    4. ' Send strings to a serial port.
    5. 'Using com1 As IO.Ports.SerialPort = _
    6. ' My.Computer.Ports.OpenSerialPort("COM1", 2400, IO.Ports.Parity.None, 8)
    7. SerialPort1.Encoding = enc
    8. Try
    9. SerialPort1.Write(data)
    10. Catch
    11. MessageBox.Show("Anschluß geschlossen")
    12. End Try
    13. End Sub
    14. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    15. Dim s As String = Chr(80)
    16. ' Dim s As String = "s" & Chr(&HD)
    17. Dim c As String
    18. zahl = 0
    19. SendSerialData02(s)
    20. TextBox1.Text = ""
    21. Str_Read = ""
    22. For i As Integer = 1 To 16
    23. Try
    24. c = SerialPort1.ReadChar
    25. 'If c = Chr(0) Then Exit For 'ein endcod möglich
    26. Str_Read = Str_Read & c & " "
    27. Catch
    28. MessageBox.Show("Fehler " & i)
    29. Exit Sub
    30. End Try
    31. Next
    32. SerialPort1.DiscardInBuffer()
    33. TextBox1.Text = (Str_Read)
    34. End Sub



    Teste auch dies ,ist vieleicht einfacher.

    Kennung senden und 16 Byte erwarten welche in der Textbox angezeigt werden.
    Ist natürlich nicht optimal.

    Gruß