Переполнения буфера быть не должно, переполнение означает порчу
данных. А так, я не вижу, в чём засада. При обмене используются два
кольцевых буфера, один на приём, другой на выдачу. В каждом три
волятильных параметра, голова, хвост и счётчик. По голове буфер
набивается, по хвосту очищается. Допустим, буфер 500 байт, набилось
100, можно передавать. Передаём длину "100" и байты, после
контрольную сумму. Приемник сообщил, что в пакете ошибка. Хорошо,
повторим. Смотрим на счётчик, опачки. Пока передавали, в буфер набилось, скажем, ещё 50 байт (т.е. голова "переехала" на 50 и счётчик увеличился на 50). Хорошо, передаём длину "150" и повторяем передачу. Приёмник сказал - Ок! Тогда от текущего значения счетчика отнимаем 150 и двигаем хвост на 150. всё.