формат пакета менять нельзя, и назначение буфера комбинированное -
приёмный, и одновременно передающий. Заголовок формируется на лету,
часть пакета из других данных, потом к нему приаттачивается этот
буфер, и в конце контрольная сумма. Если было переполнение буфера
(на самом деле контрольная точка за полсотни байт до конца), -
формируется и передаётся заголовок с излишней длиной пакета, блок
данных (в сумме около 40+ байт), а потом уже начинает передаваться
кольцевой приёмный буфер, который будет одновременно и заполняться входящими данными. По окончании приёма по UART (CRLF, или таймаут в пару байт), добиваем пакет до заявленной длины нулями. В общем, с двумя указателями реализуется вроде всё.