У меня есть приложение в форме окна, которое нужно читать в байтовом массиве раз в мс.
Во-первых, вам не нужно читать «каждую мс», вы заблокируете пользовательский интерфейс, если вы находитесь в потоке пользовательского интерфейса (которым вы являетесь, поскольку вы не используете многопоточность).
Массив байтов различается по размеру, но никогда не будет длиннее 36 байт.
Вместо того, чтобы пытаться читать по одному пакету каждую MS, вы должны буферизовать данные по 36 байт за раз и затем обработать их. Например. Готовы 36 байтов, найдите байт, который говорит вам, как долго должен быть пакет, затем обработайте столько байтов. При следующем чтении последовательного порта объедините массив любых неиспользуемых байтов со следующими 36 байтами, которые вы прочитали (размер вашего буферного массива должен быть не менее 72 байтов, и в каждом цикле вы должны проверить, превышает ли текущий размер больше 36, и если это так, зациклите дополнительное время, чтобы в определенный момент времени в буфере байтового массива было не более 1 полного пакета).
Кроме того, вместо того, чтобы блокировать поток пользовательского интерфейса и вместо использования потоков, вы должны использовать async / await для непрерывного чтения прочитанных данных, а затем обрабатывать ваши данные таким образом. Как непрерывно асинхронно читать данные .
Таким образом, вы получите размер пакета, затем дождитесь, пока размер буфера станет подходящим, и обработаете данные.
То, как вы сейчас это делаете, удалит дополнительные буферизованные данные и рассинхронизирует ваше соединение. Тем не менее, вы также должны попытаться использовать байт флага (или символ новой строки) для обозначения начала или конца пакета. Очевидно, что если это не ваше оборудование, вы не можете это контролировать, но если вы можете, это гарантирует, что поток никогда не рассинхронизируется.
TL: DR: синхронизация ненадежна, просто обрабатывайте пакеты по мере их поступления.