Последовательный опыт работы с UART, а не исследование.
Я нашел меньше проблем с сообщением, когда включены следующие слова - или, другими словами, выполняют как SOF/EOF, так и (длина - возможно)/код. Рама:
- SOFrame
- (длина может быть)
- данных (адрес, в, из, типа, последовательность #, опкода, байтов и т.д.)
- CheckCode
- EOFrame
Неизменно, полученные "FAMEs" включают в себя:
- хорошие - никаких проблем.
- Коррумпирован из-за того, что отправитель не отправил полное сообщение (оно зависало, отключилось или включалось при включении питания) (приемник должен тайм-аут незавершенных неполных сообщений.)
- Поврежден из-за помех или помех передачи. (ошибки каротажа байта, четность, неправильные данные)
- Поврежден из-за приема приемника в середине отправленного сообщения или отсутствия нескольких байтов из-за превышения входного буфера.
- Общие столкновения автобусов.
- Перерыв - это законно в вашей системе?
Независимо от используемого вами фрейма, обеспечьте надежную защиту этих типов сообщений, быстро подтвердите # 1 и быстро идентифицируйте 2-5 и готовьтесь к следующему кадру.
SOF имеет огромное преимущество, что легко начать снова, если приемник теряется из-за предыдущий кадр гречихи и т.д.
Длины хорошо, но ИМХО не менее полезно. Он может ограничивать сквозной ввод, если длина должна быть в начале сообщения. Некоторые операции с низкой задержкой просто не знают длины, прежде чем они будут готовы начать передачу.
CRC Рекомендовать более 2-х байт. Короткий чек-код не улучшает меня. Я бы предпочел не иметь чек-код, чем 1-байтовый. Если ошибки происходят время от времени, они могут быть пойманы чек-кодом, я хочу что-то лучше, чем 2-байтовый 99.999% времени, мне нравится 4-байт 99.99999997%
EOF так полезно!
КСТАТИ: Если протокол ASCII (вместо двоичной), рекомендуют не использования cr
или lf
как EOFrame. Может быть, использовать их только вне кадра, если они не являются частью сообщения.
BTW2: Если ваш ресивер может автоматически обнаружить бод, это избавит вас от многих проблем с конфигурацией.
BTW3: Отправитель может рассмотреть возможность отправки байта «ничего» (до SOF), чтобы обеспечить надлежащую синхронизацию SOF.
Спасибо! Хорошие аргументы! – user2479653
Пропущенные бои, бит за слово, четность, неожиданные уровни сигналов также вызывают проблемы. – chux