_DataReceived ist zu ende und keiner hats gemerkt.. mehr oder weniger...

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von dw.katze.

    _DataReceived ist zu ende und keiner hats gemerkt.. mehr oder weniger...

    Hallo,

    ich hab wohl ein ungewöhnliches Problem, da ich dazu nix finden kann... liegt wohl an meiner Art zu programmieren.. :pinch:

    Ich rufe eine Form auf in der ich mit einem Button den COM-Port öffne, dann benutze ich das DataReceived Event um Daten zu speichern (ich starte an dem COM-Port angeschlossenem Gerät per Knopfdruck die Datenübertragung. Nun kommen einige Daten und die werden auch sauber weggespeichert).

    Jetzt mein Problem: Irgendwann ist der Fertig mit Datenübertragung aber keiner hats gemerkt.. ich würde gerne dem Benutzer mitteilen, daß gerade eine Datenübertragung stattfindet und ihm sagen wann sie beendet ist. vllt. auch nach Beendigung eine neue Form aufmachen...

    wie kann ich abfragen ob ich fertig bin oder ob nichts mehr kommt..oder wie oder was oder wo.... ?(

    Mir fehlen da die Ideen aufgrund mangelnder Programmierpraxis.. :|


    Noch eine kleine andere Frage:
    Me.Invoke(Sub() xxxxx) funktioniert mit 2008 nicht(Sub wird unterstrichen mit der Meldung("Ausdruck erwartet), weiß einer warum? Wenn ich ehrlich bin wüsste ich auch nicht wozu ich das bräuchte..
    die Erklärungen in den Unterlagen die man so findet sind für mich dahingehend nicht verständlich wofür man invoke braucht.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „dw.katze“ ()

    Du kannst im DataRecivedEvent die Eventargs auf Eof (EndOfFile) auswerten.

    VB.NET-Quellcode

    1. If e.EventType = IO.Ports.SerialData.Eof Then


    Zum Invoke:
    Invoke verwende ich wenn ich von einem anderen Thread die Steuerelemte der GUI Form ändern will.
    In VB 2008 muss man das etwas umständlicher über Delegaten machen. Ich machs immer so:
    Bsp.: für ein Label Text ändern

    VB.NET-Quellcode

    1. Delegate Sub delSetLabel(ByVal lbl As Label, ByVal Text As String)
    2. Private Sub SetLabel(ByVal lbl As Label, ByVal Text As String)
    3. lbl.Text = Text
    4. End Sub
    5. If Label1.InvokeRequired Then
    6. Label1.Invoke(New delSetLabel(AddressOf SetLabel), New Object() { Label1, "Test123"})
    7. Else
    8. SetLabel(Label1, "Test123")
    9. End If


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Danke für die schnelle Antwort! Werde ich sofort teste. Sollte es klappen gibt es natürlich eine Bewertung! ;)
    Das mit dem Invoke und Delegate werd ich mir bei Zeiten zu Gemüte führen. Hab in den online Büchern auf jedenfall schonmal Delegate gefunden..^^


    /EDIT
    Schade funktioniert nicht.. springt nicht in die Schleife.. und wenn ich IO.Ports.SerialData.Eof "überwachen" will meldet er "Ports" ist kein Member von "IO"..
    hab dann zum testen System. vor IO.xx.xx.Eof gesetzt aber leider ohne Erfolg..
    ich denke von meinem Gerät wird kein EndOfFile gesendet.. der Datenfluss ist irgendwann vorbei..
    :(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dw.katze“ ()

    fichz schrieb:

    In VB 2008 muss man das etwas umständlicher ...
    na, so umständlich nu auch wieder nicht

    VB.NET-Quellcode

    1. Private Sub SetLabel(ByVal txt As String)
    2. If Label1.InvokeRequired Then
    3. Me.Invoke(New Action(Of String)(AddressOf SetLabel), txt)
    4. Else
    5. Label1.Text = txt
    6. End If
    7. End Sub
    8. 'aufruf
    9. SetLabel("dr neue Text")
    @dw.katze: Wenn Du Daten empfängst, solltest Du wissen, wann das zu Ende ist. Ein EOF empfängst Du nur dann, wenn auch ein EOF gesendet wird.
    Du musst beim Empfang das Empfangene überwachen und dann am Inhalt, an der übertragenen Länge oder an der entsprechenden Ende-Kennung erkennen, dass die Übertrragung beendet ist.
    Was ist denn das für eine Gegestelle?
    Wie ist das Protokoll definiert?
    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!
    JOU! Du hast sooooo recht! :thumbsup:
    Der Groschen ist gefallen!

    Ich hab mir immer nur den String angeschaut und an dem kann man nicht erkennen wann die Übertragung zu Ende ist. Jetzt hab ich aber, dank deines Denkanstoßes, mir mal die Bytes angeschaut und siehe da es gibt scheinbar eine Sequenz am Ende (der 193 Bytes) die beim letzen "Paket" bzw. Datensatz anders ist als bei den vorherigen.

    pju.. kurz davor das Projekt in die Ecke zu ballern.. Gestern den ganzen Tag damit verbraten...:wacko:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dw.katze“ ()

    :cursing: ;( :wacko:

    ist doch nicht so....

    Die Übertragung endet ohne "Merkmal"....
    Wie alle "Pakete" endet das letzte mit CR LF ...

    vllt. noch jemand ne Idee wie ich abfragen kann ob die Datenübertragung zu Ende ist?

    //EDIT

    ok.. hab es jetzt anders gelöst. hab den nach 80 ms sleep gefragt ob BytesToRead < 2 und das funktioniert ganz gut.. ohne die 80ms funktiert das nicht. Ist wohl zu schnell.
    Danke für die Anregungen und Hilfestellungen! :thumbup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dw.katze“ ()