Похоже, что конец микроконтроллера не настроен на хорошую работу по обслуживанию как UART, так и периферийных устройств SPI, и поэтому слишком быстрое появление последующих символов в UART либо приводит к тому, что SPI не обслуживается, или, возможно, пропустить некоторые символы в UART.
Надежное решение - понять проблему и исправить ее в архитектуре кода микроконтроллера. Например, вам может понадобиться использовать прерывания и заставить программы обработки прерываний перемещать символы между более длинными программно управляемыми фиффами и часто 1- или 2-глубокими фифо в периферийном оборудовании.
Возможно, работоспособное, но более рискованное решение состоит в том, чтобы приложение C # вставляло задержки между символами, которые оно отправляет, чтобы воспользоваться очевидной работой при наборе текста человеком. Разновидностью этой темы является наличие встроенных символов эха устройства, и программа C # ожидает эхо каждого символа перед отправкой следующего (вам также понадобится escape-символ для очистки встроенного буфера команд и запуска заново, если программа C # решает объявить тайм-аут встроенного устройства и начать все сначала)
Другая идея заключается в сокращении данных, которые должны быть отправлены. Удобные для чтения командные языки для встроенных систем великолепны, потому что, как вы заметили, вы можете играть с ними, используя терминальное приложение. Однако, если встроенная система чрезвычайно ограничена, использование упакованного двоичного или шестнадцатеричного формата может облегчить анализ. Самым простым случаем этого является крайний случай односимвольных команд с паузами между ними для выполнения (и если вы в основном используете буквенно-цифровые символы, вы снова можете использовать программу терминала)