Я должен был сделать нечто подобное в прошлом. Хотя в рассматриваемом протоколе не использовались какие-либо байты-разделители, он имел crc и несколько байтов с фиксированным значением в определенных позициях, поэтому я мог спекулятивно декодировать сообщение, чтобы определить, было ли оно полным отдельным сообщением.
Меня всегда удивляет, когда я сталкиваюсь с этими протоколами, в которых нет контекстной информации.
Ищите поля crc, поля длины, поля типа с соответствующим указанием ожидаемой длины сообщения или любые другие поля фиксированного смещения с предсказуемыми значениями, которые могут помочь вам определить, когда у вас есть одно полное сообщение.
Другим подходом может быть использование API-функций CreateFile, ReadFile и WriteFile. Существуют настройки, которые можно изменить с помощью функции SetCommTimeouts, которая позволяет остановить операцию ввода-вывода при возникновении определенного промежутка времени.
Лучше всего сделать это вместе с умозрительным декодированием.