SerialPort DataRecieved Event erst nach öffnen des SerialPort aktivieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von WhitePage.

    SerialPort DataRecieved Event erst nach öffnen des SerialPort aktivieren

    Hallo zusammen,

    ich habe folgendes Problemchen. Ich rufe eine Form auf, in welcher ich per RadioButton-Auswahl verschiedene Aktionen mit einem SerialPort ausführe. Der zu verwendende SerialPort wird erst geöffnet, wenn dieser in der gleichen Form mittels ComboBox ausgewählt und auf einen Button geklickt wird.

    Nun benötige ich in der gleichen Form eine RichTextBox, welche über das DataReceived Event Daten in Empfang nimmt.

    Dazu habe ich folgenden Code verwendet, der auch hier aus dem Forum stammt. Ich glaube von Rod.

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Me.Invoke(Sub() ReceivedText(SerialPort1.ReadExisting()))
    3. End Sub
    4. Private Sub ReceivedText(ByVal [text] As String)
    5. RichTextBox1.Text &= [text]
    6. End Sub


    An sich klappt der Code auch super, ABER da der SerialPort noch nicht geöffnet worden ist, kann natürlich das Event auch nicht verwendet werden. Ergebnis ist, dass sich die Form aufhängt und das wars.

    Ich denke die Lösung wäre, wenn ich das SerialPort Recieved Event erst aktivieren würde, nachdem der zu verwendende SerialPort ausgewählt und geöffnet worden ist. Aber hier komme ich nicht wirkllich weiter.

    Lt.Winters schrieb:

    ABER da der SerialPort noch nicht geöffnet worden ist, kann natürlich das Event auch nicht verwendet werden. Ergebnis ist, dass sich die Form aufhängt und das wars.


    Das verstehe ich gerade nicht. Wenn er noch nicht offen ist, dann gibt es auch kein Event. Kann es sein, dass sich deine Form wegen was anderem aufhängt?

    Lt.Winters schrieb:

    Ergebnis ist, dass sich die Form aufhängt
    Wobei?
    Wenn ein Port nicht offen ist, gibt es auch kein DataReceived-Event.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das ist besagte Form. Links ist die Auswahl des ComPorts und rechts die Aktion. Und ganz rechts ist die RTB mit dem RecievedEvent.

    Hier geht es insbesondere um "Konfig senden". Hier sende ich Text aus einer RTB über den SP an ein Gerät.



    Der dazugehörige Code zum Senden sieht so aus:

    VB.NET-Quellcode

    1. Select Case True
    2. Case RadioButton3.Checked = True 'Konfig senden
    3. Try
    4. Form13.Visible = True 'Ladebalken marquee
    5. Form1.Label54.Text = CStr((Form1.RichTextBox1.TextLength)) 'Anzahl der zu sendenden Zeichen
    6. SerialPort1.PortName = ComboBox1.Text 'COM-Port Bezeichnung
    7. Form1.PictureBox35.Image = My.Resources.LED_grün 'Form1.PB35 grün füllen
    8. Dim Anzeige1 As String
    9. Anzeige1 = ComboBox1.Text & " / " & SerialPort1.BaudRate & " Baud"
    10. Form1.Label52.Text = Anzeige1 'Anzeige COM-Port und Baud-Rate
    11. SerialPort1.Open()
    12. SerialPort1.Encoding = System.Text.Encoding.GetEncoding(1252) 'Kodierung Windows 1252
    13. SerialPort1.Write("l") 'Logout
    14. SerialPort1.Write("L2") 'Login Level 2
    15. SerialPort1.Write(Chr(13) + Chr(10)) 'Sendet CR+LineFeed
    16. Dim i As Integer
    17. For i = 0 To Form1.RichTextBox1.Lines.Count - 1
    18. SerialPort1.Write(Form1.RichTextBox1.Lines(i) + vbCrLf) 'Sendet einzelne Zeilen aus RichTextBox1 eingelesene Konfig + CrLf
    19. Next i
    20. SerialPort1.Close()
    21. Form13.Visible = False
    22. MsgBox("Die Konfiguration wurde erfolgreich gesendet.", MsgBoxStyle.Information, "TCS-Conf")
    23. Form1.PictureBox35.Image = My.Resources.LED_rot 'Füllt Form1.OS1 grau
    24. Form1.Label52.Text = ("COM-Port geschlossen.")
    25. Form1.Label54.Text = ("0")
    26. Thread.Sleep(2000) 'Wartet 2s bis Geräte-Reset
    27. Catch ex As Exception
    28. MsgBox(ComboBox1.Text & " kann nicht geöffnet werden.", MsgBoxStyle.Critical, "Fehler")
    29. End Try
    30. ...


    Den Code für das RecievedEvent habe ich ja oben bereits gepostet.

    Lt.Winters schrieb:

    Das ist besagte Form.
    Lass sie sich mal aufhängen und drück den Break-Button.
    Bei welcher Zeile bleibt das Programm stehen?
    Bilder
    • Break.png

      4,23 kB, 216×109, 301 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @WhitePage: Ja sry bin halt noch Anfänger :D

    @RodFromGermany: Hängt bei "Me.Invoke(Sub() ReceivedText(SerialPort1.ReadExisting()))". Also dem DataReceived Ereignis. Der Text aus der RTB, welchen er senden soll, wird auch noch gesendet. Das habe ich eben noch überprüft.

    Lt.Winters schrieb:

    Hängt bei "Me.Invoke(Sub() ReceivedText(SerialPort1.ReadExisting()))"
    Dann wollen wir diese Prozedur mal aufdröseln:

    VB.NET-Quellcode

    1. Dim txt = SerialPort1.ReadExisting()
    2. Me.Invoke(Sub() ReceivedText(txt))
    Wo hängt er jetzt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bei "SerialPort1.Close()" vom Konfig senden.

    Wenn ich ihn nicht schließe klappt es, ABER dann bleibt der Port blockiert und ich kann keine weiteren Aktionen in der Form mit dem Port ausführen.

    Habs gelöst...ich frage vor jeder neuen Aktion, ob der SP geöffnet ist und falls ja schließe ich ihn.

    Ich danke euch für eure Hilfe! :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Lt.Winters“ ()

    Lt.Winters schrieb:

    ABER
    Wenn Du das Garagentor zumachst, während Du mit dem Auto rausfährst, ist das Auto put.
    Warum gibst Du denn dem Port keine Zeit, seine Aufgabe zu erledigen?
    Das dauert halt eine Weile, weil das Senden und das Empfangen halt Zeit in Anspruch nehmen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!