10 Hz UDP mit nur 5 Hz empfangen

  • Hallo Leute,

    ich habe einen Rechner, der schickt mir mit 10 Hertz UDP Nachrichten (Messwerte). Ich würde aber gern das Signal nur mit 5 Hz emfangen, damit ich genügend Zeit für meine Berechnungen in der Zwischenzeit habe. Jetzt habe ich festgestellt, dass wenn ich das mache dann kommen alle Werte rein aber mit entsprechender Verzögerung, soll heißen der 10te Wert, den ich nach 2 Sekunden empfange ist der Wert der zum Zeitpunkt 1 Sekunde aktuell war. Kann ich nicht brauchen.

    Gibt es ne Möglichkeit dass ich das umgehen kann und die Zwischenwerte "Wegscheißen" kann?

    Mein Programm:

    UDPStartup()
    $verbindung = UDPBind(...)

    $Timer = Timerinit()
    $zeit = 0
    while 1
    Select
    case GUIGetMsg() = $GUI_EVENT_CLOSE
    ExitLoop
    case TimerDiff($timer) > $zeit * 200
    $Messwert = Datenaufnahme()
    ;irgendwas rumrechnen
    endselect
    wend


    func Datenaufnahme()
    return UDPrecv($verbindung)
    endfunc


    Danke!

    Einmal editiert, zuletzt von pipo28 (13. Juli 2012 um 16:24)

  • Vielleicht gehts so:

    [autoit]


    func Datenaufnahme()
    UDPrecv($verbindung)
    return UDPrecv($verbindung)
    endfunc

    [/autoit]


    Das zusätzliche "UDPrecv" soll die gespeicherten Daten ins Nirvana schicken.
    Ob ich das richtig verstehe ? Ausprobiern.

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

  • hi .. also soweit ist weis, wird anders als bei tcp -> udp NICHT der Reihenfolge nach abgearbeitet ...( kein FIFO )

    d.h. du solltest schneller abfragen, als Daten kommen .. sonst bekommst du ein durcheinander ..

    also würde ich eine Abfrage schreiben, die die Daten schneller holt, als diese reell ankommen und dir dann lieber nur jeden 2 oder keine Ahnung 5 Wert erst rauspicken und verarbeiten ..
    und wenn du schneller abfragst als geliefert wird dann haste halt n Zero Bit .. das du einfach nicht beachtest ..

    .. oder reden wir jetzt aneinander vorbei ... ?

  • Danke für die Antworten. Ich habs grad ausprobiert, so würde es gehen aber es stellt sich ein neues Problem:

    Wenn ich mache

    [autoit]

    while 1
    $data = UDPRecv($socket, 50)
    If $data <> "" Then
    $letzte_gueltige_Daten = $data
    else
    ExitLoop
    EndIf
    WEnd
    return $letzte_gueltige_Daten

    [/autoit]

    dann ist zwar sichergestellt, dass ich immer die letzten, aktuellsten Messwerte empfange, aber wenn ich die Zeit mitlogge habe ich gesehen, dass die Funktion UDPrecv 100 Millisekunden wartet ob Daten kommen. Das heißt bevor ich da oben in den else Zweig und aus der Schleife rauskomme vergehen 0.1 Sekunden. Geht nicht, ist mir zu lang.

    Gibt es eine Möglichkeit den Timeout von UDPrecv runterzustellen???

    die Lösung von Ohforf würde schon funktionieren, aber da hab ich Angst dass ich irgendwie, irgendwann asynchron werde und außerdem würde ich gern die Möglichkeit haben die Abfragefrequenz mit der mein Skript läuft beliebig ändern zu können (habe ich vergessen dazu zu sagen).

  • Danke autoBert,

    es hilft zwar nicht, die Option funktioniert wohl nur für TCP. Aber das Schlagwort hat mcih über google ins englische Forum geführt und da ist ein Eintrag zu dem Problem.

    Ich werd es mir Morgen mal zu Gemüt führen, leider befürchte ich dass es meinen Horizont übersteigt was ich so auf den ersten Blick sehe.

    Also wenn jemand für mich noch eine leichter nachzuvollziehene Lösung hat und die Denkarbeit für mich übernehmen kann dann gerne :D

  • So wie ich das verstanden habe, erhältst du alle 100ms einen neuen Wert. Du willst aber nur alle 200ms mit einem Wert rechnen. Dann lese doch alle 100ms die Werte ein, aber verwirf einfach jeden zweiten Wert bzw. rechne nur mit jedem zweiten Wert (z.B. eine Toggle-Variable verwenden).