Buffer nach bestimmer Zeit löschen

Hallo zusammen,

gibt es eine Möglichkeit über einen Timer (oder so) den Bufffer (SetBuffer und GetBuffer) zu löschen wenn 1 Sekunde lang nichts mehr rein geschrieben wurde? Oder muss ich dann doch auf eine String Variable ausweichen?

Ich will damit verhindern, dass kaputte Nachrichten entstehen. Wenn nach einer Sekunde die Nachricht immer noch nicht vollständig ist, wird da sicherlich nichts mehr kommen. Ich bekomme Daten im HEX Format und muss diese auf 22 Zeichen buffern/cutten, ein Sync Zeichen oder so konnte ich nicht entdecken.

Gruß Basti

Wenn du es wirklich so machen willst, speichere doch den Timestamp in einem Buffer.
Und beim Empfang prüfst du die Differenz und verwirfst sonst den ReceiveBuffer.
Wobei ich bisher kein Protokoll gesehen habe, welches nicht entweder ein Start, Stop, Sync Zeichen oder wenigstens ein Längenfeld hat.
Michael

Hm, hast du eine Idee wo ich mich über serielle Kommunikation informieren kann, wie so Nachrichten meistens aufgebaut sind? Google spuckt mir dazu garnichts aus und ich hatte damit noch nie zu tun. Meistens kommt ne 01 am Ende, aber nicht immer (z.B. bei initialisierung, paring, ack kommt keine 01 am Ende). Wie suche ich am Besten nach einen Sync zeichen?

Danke

Gruß Basti

Das hat ja erstmal nix mit der seriellen Kommunikation zu tun, sondern am verwendeten Protokoll.
Welches willst du den implementieren?
Michael

Das DuoFern Protokoll. Allerdings ist das, soweit ich weiß nicht öffentlich zugänglich. Alles was ich über das Protokoll gefunden habe ist das hier:

fhem-mirror/10_DUOFERNSTICK.pm at f3bb0be1177d61f5e8a45f74666938233ad13cbe · mhop/fhem-mirror · GitHub
fhem-mirror/30_DUOFERN.pm at f3bb0be1177d61f5e8a45f74666938233ad13cbe · mhop/fhem-mirror · GitHub

Die cutten auch einfach auf 22 Zeichen, gefallen tut mir das aber auch nicht, kann nur kein Muster erkennen.

Gruß

Ich hab nochmal über den TimeStamp nachgedacht. Bist du sicher, dass es eine gute Lösung ist? Ich könnte nen JSON Objekt mit timestamp und buffer mit SetBuffer reinschreiben, dann hätte ich aber jedesmal das de- und encoden. Oder in eine Extra Variable, aber dann könnte ich ja gleich den Buffer in ne Variable schreiben und mit nem Timer löschen. Oder liege ich da falsch?

Gruß Basti

// EDIT: Ich habe es mal mit zwei Buffern versucht, jemand Verbesserungsvorschläge? Bekomme in PHP die Zeit in Milliekunden nicht schön gemessen.


	/**
	 * Receive data from parent IO
	 *
	 * @param string $JSONString
	 *        	data json encoded
	 * @return boolean always true
	 */
	public function ReceiveData($JSONString) {
		// decode data
		$data = json_decode ( $JSONString );
		
		// get receive buffer
		$receiveBuffer = unserialize ( $this->GetBuffer ( "ReceiveBuffer" ) );
		
		// check last receive timestamp, if last receive time > 500ms flush buffer
		$lastReceiveTimestamp = $this->GetBuffer ( "LastReceiveTimestamp" );
		$lastReceiveMs = number_format ( microtime ( true ) - $lastReceiveTimestamp, 4 ) * 1000;
		if ($receiveBuffer != "" && $lastReceiveMs > 500) {
			$this->SendDebug ( "FLUSH BUFFER", $receiveBuffer, 1 );
			$receiveBuffer = "";
		}
		
		// add new data at end of receive buffer
		$receiveBuffer .= utf8_decode ( $data->Buffer );
		
		// if complete msg in receive buffer
		if (strlen ( $receiveBuffer ) >= 22) {
			// get msg from buffer
			$msg = substr ( $receiveBuffer, 0, 22 );
			
			// send msg as debug msg
			$this->SendDebug ( "RECEIVED", $msg, 1 );
			
			// remove msg from receive buffer
			$receiveBuffer = substr ( $receiveBuffer, 22 );
		}
		
		// set new receive buffer
		$this->SetBuffer ( "ReceiveBuffer", serialize ( $receiveBuffer ) );
		
		// set last receive timestamp
		$this->SetBuffer ( "LastReceiveTimestamp", microtime ( true ) );
		
		return true;
	}