Цитата
получается такая фигня.
контроллер заполняет в фоне буфер, но в какой-то момент работы с устройством, получает по прерыванию от УАРТ байт, не успевает его обработать, получает следующий байт и этот второй байт теряется.
Да сделайте нормальный протокол, который будет гарантировать доставку и забудьте про эти символы..
Если протокол правильно организован, то вопросы сколько там кто байтов выдает и когда, сколько байтов теряется, где и почему - отпадают.
Приходит символ, возникает прерывание, мы сразу вытаскиваем принятый символ из UDR, тут же анализируем стаффинги (если есть), здесь же считаем частичную CRC.. Анализируем условие окончания пакета. Если условие наступило - проверяем CRC, если CRC в порядке - размещаем пакет в очереди на обработку (если модбас - то проще никакой очереди нет т.к. может прийти только один пакет). (Мне вот непоятно, как же ж тут можно неуспеть обработать байт-то??)
После чего возвращаемся к исполнению прерванной программы...
Когда подходит время - переходим к обработке пакета: вытаскиваем данные, размещаем их в требуемом буфере, и формируем и отправляем подтверждение для компа. Если комп получает подтверждение, то шлет следующий пакет, если не получает, то через заданное время (Таймаут) поторяет текущий пакет, до тех пор пока не получит подтверждения..
Привожу иллюстрацию организации обмена:
Эскизы прикрепленных изображений