Всем привет!
Пишу диагностическую панель в браузере с использованием Web Serial API (плюс тестирую аналогичный сервис на Node.js через serialport) и столкнулся с неприятной проблемой фрагментации бинарных потоков и зависания reader-локов. Надеюсь, кто-то из опытных коллег уже набивал шишки на стыке фронтенда и работы с железом.
Немного контекста: мы собираем в лаборатории тестовый стенд для снятия телеметрии с микроконтроллеров. Физически все это подключено через целый ворох компьютерных и сетевых кабелей — самодельные переходники RS-485/USB, различные сервисные патч
https://serverorbit.com/cables/miscellaneous -корды и витые пары для снятия сигналов с датчиков. Контроллеры непрерывно шлют пакеты телеметрии (фиксированные фреймы по 32 байта) по последовательному интерфейсу на скорости 115200 бод.
Основная проблема в том, что чанки из ReadableStream в браузере приходят произвольными кусками и совершенно не привязаны к границам наших пакетов. В зависимости от таймингов ОС и буферизации данных в кабеле, в одном read() может прийти 12 байт, а в следующем — 52 байта, содержащих остаток прошлого пакета и начало нового.
Сейчас базовый цикл чтения выглядит примерно так: