@sast
Ich seh das auch so das Du alle Nulldurchgänge mitbekommen musst, damit eine klare Aussage 1 oder 0 getroffen werden kann.
Ich würd aber in den Rahmen am Anfang mehrere Bytes Preambel einbauen, damit sich Sender und Empfänger mal "warmlaufen" können.
Diese Preambel wird dann beim Empfänger wieder verworfen leitet aber den Empfang der eigentlichen Bytes ein. Ich würd trotz allem einen Leitungscode verwenden, dadurch wären dann unverwechselbare Bytes für die Preambel möglich.

Für die Synchronisierung der Uhren hab ich mir das so gedacht.
Die Master Uhr sendet ihre aktuelle Zeit und einen leeren Offsetwert aus.
Die Slave Uhr nimmt diese Zeitinformation auf und übergibt Sie ihrer RTC.
Der Slave sendet nun ebenfalls seine aktuelle Zeit wieder an den Master zurück.
Der Master subtrahiert nach dem Empfang die empfangene Zeit von seiner internen RTC und teilt das Ergebnis durch 2.
Der Master sendet nun wiederum seine aktuelle RTC Zeit und versendet im selben Rahmen noch den errechneten Offset mit.
Die Slave RTC nimmt die Zeitinformation auf und addiert den Offset dazu.
Das Ergebnis wird der RTC des Slaves übergeben.
Dadurch sollten beide Uhren jetzt synchron laufen.
Bei den nachfolgenden Synchronisationsläufen kann man noch eine Filterfunktion einbauen, die den neuen Wert mit dem gespeicherten Offsetwert gewichtet verrechnet und Extremwerte verwirft.
Vorraussetzung für das funktionieren dieses Systems ist, das beide Richtungen die gleiche Laufzeit haben und die Anzahl der übertragenen Bytes gleich ist (Rahmendauer). Zumindest für die Pakete die der Synchronisierung dienen.
Dadurch scheiden für mich auch Funkmodule mit sich verändernder Durchlaufzeit aus.
Das Synchronisationsproblem ist auch der Grund warum ich nur maximal eine Durchschaltestelle haben will, da ich sonst den Offset für jede Station neu berechnen muß. Im Master muss ich das ohnehin machen.
Der Königsweg wäre für mich immer noch eine zentrale Taktquelle, allerdings scheidet das wegen der nicht unerheblichen Kosten leider aus.