То, что я напишу ниже, мне лично очевидно. Но когда начинаешь писать прошивки для микроконтроллеров -- это может быть ещё не очевидно. Так, на днях я обнаружил эту ошибку в прошивке у начинающего микроконтроллерщика. А за пару недель до этого -- у себя.

Воспользуемся классической терминологией -- Алиса отправляет Бобу сообщение. Сообщения. Одинакового формата, одно за другим.

Вариант первый -- в соответствии с договорённостью Боб ожидает получить сообщение длиной 8 байт. Однако после третьего байта Алиса внезапно умирает.

Когда Алиса воскресает, она, конечно, не помнит, что и кому она передавала, поэтому начинает передавать сообщение заново. Однако Боб об этом не знает. Получив первый байт нового сообщения, он записывает его как четвёртый байт старого сообщения! Фейл! Границы сообщений "сползают", в итоге Боб будет всё время получать неправильные сообщения и удивляться, почему не совпадает контрольная сумма.

Второй вариант -- Боб и Алиса договорились, что первым байтом сообщения будет 0x55. Однако либо Алиса сошла с ума -- и начала присылать неправильные сообщения, либо Боб подошёл к передатчику в середине сообщения, поэтому первым принятым байтом оказалось не 0x55, а, скажем, 0xAA. Если Боб не будет игнорировать ошибочное начало сообщения, а будет писать байты подряд, то он опять никогда не синхронизирует границы сообщений, как и в первом случае. Все сообщения будут признаны ошибочными из-за неправильной сигнатуры.

Действия тут очевидны:
1. В первом случае: если возникает пауза при передаче, то необходимо "забывать" недополученное сообщение и начинать приём заново. На практике это означает, что надо обнулять буфер приёма, если очередной байт (бит) был принят после паузы на линии.
2. Во втором случае сложнее. Если первый ожидаемый байт оказался неправильным, то буфер, конечно же, должен быть сразу обнулён. Однако, если сообщения сыпятся потоком, на восстановление синхронизации может уйти какое-то время, если сигнатура в сообщении присутствует не только в начале, но и в середине (может же случайно оказаться, что мы хотим передать сообщение 0x55 55 55 55 55 55 55 55?). Полностью эту ситуацию не побороть, можно только уменьшить количество потерянных сообщений, если, к примеру, увеличить длину сигнатуры, либо запретить её применение в остальной части сообщения.