а можно как-то получая через UART сообщения разной длины, вычислить когда конец сообщения? или это возможно исключительно обработкой ручной по какому-то флагу (из протокола или как-то так)?
У некоторых серий STM32(если речь про них) - есть настраиваемый тайм-аут, по которому выдаётся прерывание. В общем случае - по первому байту запускать таймер, по каждому следующему - сбрасывать.