Мы, возможно, не все знакомы с G-кодом, ссылка всегда полезна для технологии, специфичной для домена.
Я бы сказал, что простая контрольная сумма, вероятно, адекватно соответствует длине данных, формату и производительности процессора. Если вы уже выбрасываете символы, вы вряд ли захотите увеличить нагрузку на процессор с помощью CRC?
У вас есть несколько линий защиты в этом протоколе. Данные должны быть правильно сформированы, последовательно и проходить контрольную сумму, они также имеют довольно ограниченный допустимый набор символов. Так что проверка синтаксиса, последовательности и контрольной суммы вместе будет довольно надежной. Кроме того, вы можете проверить, что значения параметров находятся в границах, и, конечно, ваш UART будет иметь базовую проверку на четность, если вы решите использовать ее.
Проблема переполнения регистра RART UART лучше решается путем проверки флага переполнения UART. UART всегда имеют аппаратное обнаружение переполнения и генерацию прерываний при ошибке переполнения. Если ваш последовательный вход управляется прерываниями, то, вероятно, вы либо не включаете и не обрабатываете переполнение, либо, возможно, вы игнорируете его и рассматриваете как обычное прерывание приема. Если вы не получаете переполнение, проблема в устройстве FTDI, и потеря данных происходит до того, как оно попадет в UART. Последние два абзаца ниже посвящены возможным решениям этой проблемы.
Какова скорость передачи по этой ссылке? В большинстве случаев, если вы сбрасываете символы на типичной скорости передачи данных UART, реализация имеет недостатки. Возможно, вы слишком долго отключаете прерывания ненадлежащим образом, выполняете слишком много работы на уровне прерываний или неправильно выбираете приоритет прерывания. Вам необходимо устранить основную причину, а не пытаться исправить фундаментальную проблему реализации на уровне протокола; он предназначен для работы с шумными каналами передачи данных, а не с плохим программным обеспечением.
Еще одна возможная проблема - это устройство FTDI . Я видел проблемы с несколькими драйверами FTDI, конфликтующими и вызывающими выпадение данных. Решением в этом случае было использование утилиты FTDI FTClean для удаления драйверов, а затем переустановка последней версии драйвера. FTClean, кажется, отсутствует на их сайте, хотя вы можете получить его косвенно через поиск Google. На сайте FTDI есть другой инструмент для удаления, который, я думаю, заменил FTClean. Вы получаете те же проблемы с реальным последовательным портом? Также я обнаружил, что последовательные USB-устройства, использующие устройства и драйверы Prolific, особенно подвержены потере данных даже при умеренной скорости передачи данных.
Наконец, я обнаружил ряд проблем с выпадением данных с использованием различных USB-последовательных устройств, которые могут быть решены путем «кадментирования» выходных данных. Некоторые устройства имеют относительно небольшие внутренние буферы. Возможно, вы заметили, что пропадание символов начинается после примерно 128 символов или любого другого размера внутреннего буфера USB-устройства. Вставка коротких задержек (скажем, 10 мс) в поток данных может решить эту проблему. В этом случае вы можете просто сделать это в конце каждой строки. Другой способ «кадентирования» - опросить буфер передачи в приложении для ПК и подождать, пока он не станет пустым, прежде чем добавлять дополнительные данные, а затем только добавлять данные небольшими порциями, в вашем случае, возможно, одной строкой. Я обнаружил, что это обычно решает проблемы потери данных без видимой потери производительности передачи данных.