Меня всегда напрягали протоколы, где данные могут идти непрерывным
потоком, а разделяются лишь одним-двумя "магическими" символами. Читаешь ты такой поток - о, "старт вроде", прочитал из буфера сколько нужно, считаешь CRC - фигня какая-то (а у некоторых CRC - 1 байт, так что, может даже и совпасть), начинаешь во входном буфере следующую старт-комбинацию искать…
Сейчас как раз пишу нижний уровень системы управления мелким телескопом. И там с энкодеров данные именно так приходят, ну хоть CRC о четырех байтах (правда, последний всегда 0 - зато можно ориентироваться на "стартовый символ" из двух байт, а не одного). Но, судя по дампу, там данные не непрерывно идут, а с небольшими паузами. Т.е. хотя бы при считывании можно будет посредством select'а с нужным таймаутом брать ровно по одному пакету (а дальше уж по длине смотреть - если меньше, ждем следующий пакет).
С модбасом все куда проще: можно побольше поставить таймаут селекта (байтов на 5-8), чтобы уж наверняка. Все равно это - не CAN, и покуда мастер не спросит, никто ничего не пошлет. На передаче данных тоже пофиг, т.к. комп - мастер. А чтобы слейва на компе реализовать, придется перед отправкой сообщения выдержать usleep - мало ли какой с той стороны капризный мастер, вдруг он хочет после отправки своего сообщения четко не менее 3.5 символов выждать?