Alarmdisplay über Virtuelle Serielle Schnittstelle

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Alarmdisplay über Virtuelle Serielle Schnittstelle

    Guten abend zusammen,

    ich werkle schon seit Wochen an diesem Projekt herum, aber komme einfach auf keinen grünen zweig:





    VB.NET-Quellcode

    1. Private Sub Textanzeigen(ByVal text As String)
    2. If Me.txtMeldung.InvokeRequired Then
    3. Dim d As New TextBoxCallback(AddressOf Textanzeigen)
    4. Me.Invoke(d, New Object() {text})
    5. Else
    6. txtMeldung.Text = text
    7. {Prüfungspuffer} = {Prüfungspuffer} & text
    8. Me.Filtern()
    9. End If
    10. End Sub
    11. Private Sub Filtern()
    12. If txtMeldung.Text.Contains("Tuttlingen") = True Or _
    13. txtMeldung.Text.Contains("o. SR") = True Or txtMeldung.Text.Contains( _
    14. "Geisingen") = True _
    15. Or txtMeldung.Text.Contains("NA") = True Or _
    16. txtMeldung.Text.Contains("Alarm") = True Or _
    17. txtMeldung.Text.Contains("Alarm:") = True _
    18. Or txtMeldung.Text.Contains("*") Then
    19. 'Prüfungspuffer = txtMeldung.Text
    20. Else
    21. Me.Filtern()
    22. txtMeldung.Text = Prüfungspuffer
    23. txtMeldung.Text = ""
    24. End If
    25. 'Dim Stichworte() As String = {"Abc", "Def", "Beispiel", "example"}
    26. 'Dim StrArray() As String = {Prüfungspuffer}
    27. 'Dim FindThisStrings() As String = {"ABC", "DEF", "Beispiel"}
    28. 'For Each Str As String In StrArray
    29. ' For Each findStr As String In FindThisStrings
    30. ' If Str.Contains(findStr) = False Then
    31. ' 'Das was halt zu tun ist, wenn der NICHT String enhalten _
    32. ist!
    33. ' End If
    34. ' Next
    35. 'Next
    36. End Sub

    Explizit geht es nur um die beiden Subs Textanzeigen und Filtern, Alles andere Funktioniert soweit.



    Das Programm:



    Es soll ein Alarmdisplay für meine Feuerwehr werden, welches per EA
    Monitor(Manchen Floriansjünger unter euch werden vllt. wissen was ich
    hier schreibe... :) des Digitalen Melders den Empfangenen text auf dem PCbildschirm ausgibt.

    Das Problem:

    Die EA Monitor funktion zeigt Alarmierungen des gesamten Landkreises
    an.(anders gehts in diesem fall leider nicht). Deswegen sollen die
    Alarmtexte mit Stichworten aussortiert werden, sodass nur Explizit die
    uns betreffenden Alarmierungen ausgegeben werden.

    aber je nach dem, wie ich das ganze implementiere passiert



    entweder kommt gar kein Text,

    oder es kommen nur Text stückchen

    oder das Programm stürzt ab

    oder es kommt alles rein ohne gefiltert zu werden.



    Ich habe versucht, das Array "text" direkt zu filtern, bevor es zu txtMeldung übergeben wird.

    der Versuch, den Text erst an txtMeldung zu senden, und danach erst
    per if .contains(so wies jetz ungefähr ist) zu filtern, sah für mich als
    einfachste lösung aus, hat aber auch nicht geklappt.

    Auch der versuch, "text" in einen Puffer zu laden, dort
    auszusortieren bzw. nach ausgabe auf txtMeldung auszusortieren hat auch
    nicht funktioniert...





    Bitte helft mir, und gebt mir funktionierende lösungsvorschläge, sonst werde ich gezwungen sein, das Projekt abzubrechen...


    Vielen dank schonmal im vorraus...



    PS: Da der Text hier sonst zu lang geworden wäre, hab ich hier mal
    eine ZIP datei mit dem Projektdaten hochgeladen, dass ihr mal das ganze
    anschauen könnt:



    http://www.file-upload.net/download-7697613/Programm.zip.html

    Oder mal anderst gefragt: wie kann ich erkennen, dass die datenübertragung vollständig abgeschlossen ist?



    Hab gestern mal mit der ReadTimeout eigenschaft rumgespielt, bis ich
    geblickt hab, dass das ja nur gilt, wenn ein fehler auftritt...



    Gibts da sowas wie n empfangs timeout? so dass ich quasi sagen kann:



    If übertragung beendet = True then
    Im Invoke-Fall filterst Du nicht.
    Du hast VB2010, mach es gleich so:

    VB.NET-Quellcode

    1. Private Sub Textanzeigen(ByVal text As String)
    2. Me.txtMeldung.Invoke(Sub()
    3. Prüfungspuffer &= text
    4. Me.Filtern()
    5. End Sub)
    6. End Sub
    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!
    Dem vorhandenen Text wird weiterer hinzugefügt, du kannst keine Strings addieren. Ist das gleiche wie Pfüfungspuffer = Prüfungspuffer & text.

    Allerdings addiert man keine Strings. Ist schlechter Code-Stil, gewöhne dir daher gar nicht erst an zwei Strings zu addieren (also den +-Operator zu verwenden).


    //EDIT: Aber du weißt schon, dass du höllisch aufpassen musst, wenn - zumindest in der Theorie - ein Menschenleben davon abhängen könnte!

    BjöNi schrieb:

    Dem vorhandenen Text wird weiterer hinzugefügt, du kannst keine Strings addieren. Ist das gleiche wie Pfüfungspuffer = Prüfungspuffer & text.

    Allerdings addiert man keine Strings. Ist schlechter Code-Stil, gewöhne dir daher gar nicht erst an zwei Strings zu addieren (also den +-Operator zu verwenden).


    //EDIT: Aber du weißt schon, dass du höllisch aufpassen musst, wenn - zumindest in der Theorie - ein Menschenleben davon abhängen könnte!

    Naja von diesem Projekt hängen keine Menschenleben ab. Wir haben 2erlei Meldertypen. Tonmelder, welche lediglich das Alarmstichwort ausgeben zb. Brand. Nur die Führungskräfte besitzen Textmelder. Sprich: Die Mannschaft weiß im Grunde nur dass es sich beim Einsatz um einen Brand handelt, aber nichts weiteres. Drum hängt in unserer umkleide eben dieses Alarmdisplay, um der Mannschaft beim eintreffen, ins Gerätehaus eine Genauere Information über die Situation geben zu können. Die Führungskräfte sind ja durch den Textmelder genau informiert.

    Aber danke für den Hinweis :)

    hm komisch...

    Aaalso: Die erste meldung geht Problemlos ein. Merkwürdigerweise wenn jetzt eine weitere meldung eingehen sollte, kommt diese aber nicht mehr an. kann es sein, dass ich den port nun erst wieder schließen, und neu öffnen muss oder so? ?(

    VincentTB schrieb:

    Du solltest statt Or OrElse verwenden ;)
    Zitat MSDN: Wenn der erste Ausdruck True ist, wird der zweite nicht ausgewertet.

    Meinst du deswegen?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „engelinzivil“ ()

    Geht halt immer noch nicht...

    VB.NET-Quellcode

    1. Private Sub myComPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles myComPort.DataReceived
    2. 'Select Case e.EventType
    3. ' Case IO.Ports.SerialData.Chars
    4. ' Case IO.Ports.SerialData.Eof
    5. 'End Select
    6. 'Dim msg As String = Me.myComPort.ReadExisting
    7. '' Me.Textanzeigen(msg)
    8. Static Puffer As String = ""
    9. Puffer &= Me.myComPort.ReadExisting 'an bereits eventuell vorhandene
    10. ' Daten anhängen
    11. Do Until Puffer.Contains(IO.Ports.SerialData.Eof) 'gibt es bereits ein Zeileendzeichen? (
    12. ' in dem Fall vbCrLf)
    13. 'Dim Zeile As String = Puffer.Substring(0, Puffer.IndexOf(vbCr)) _
    14. 'Zeile ausschneiden
    15. Puffer = Puffer.Substring(Puffer.IndexOf(IO.Ports.SerialData.Eof) + 1) 'der Rest im
    16. ' Puffer lassen
    17. If Puffer.Contains("Musterstadt")Then
    18. Me.Textanzeigen(Puffer)
    19. End If
    20. Loop 'Schleife so lange durchlaufen bis in Puffer kein vbCr mehr
    21. ' vorkommt
    22. End Sub
    23. Private Sub Textanzeigen(ByVal text As String)
    24. Me.txtMeldung.Invoke(Sub()
    25. txtMeldung.Text = ""
    26. Prüfungspuffer &= text
    27. txtMeldung.Text &= Prüfungspuffer
    28. Me.Filtern()
    29. End Sub)
    30. End Sub
    31. Private Sub Filtern()
    32. If txtMeldung.Text.Contains("Musterstadt") Then
    33. Prüfungspuffer = ""
    34. Exit Sub
    35. End If
    36. 'Dim Stichworte() As String = {"Musterstadt"}
    37. 'Dim StrArray() As String = {Text}
    38. 'For Each Str As String In StrArray
    39. ' For Each findStr As String In Stichworte
    40. ' If Str.Contains(findStr) = True Then
    41. ' txtMeldung.Text = Prüfungspuffer
    42. ' Else
    43. ' tslVersion.Text = "Abbruch"
    44. ' MsgBox(Prüfungspuffer)
    45. ' txtMeldung.Text = Prüfungspuffer
    46. ' End If
    47. ' Next
    48. 'Next
    49. End Sub



    So sieht das ganze mittlerweile aus. und es wird immer verwirrender... Jetz kommt nämlich gar nix mehr an....
    Was zum geier mach ich falsch?
    Setz beim Empfang einen Haltepunkt rein und stell sicher, dass Daten ankommen.
    Wenn sie ankommen, steppe Dein Programm schrittweise durch und überzeug Dich, dass es so arbeitet, wie es soll.
    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!