Следование основано на серийном опыте UART, а не на исследованиях.
Я обнаружил меньше проблем со связью, когда включено следующее - или, другими словами, выполняйте как SOF/EOF, так и (длина - возможно)/checkcode. Рамка:
- SOFrame
- (длина может быть)
- Данные (адрес, кому, откуда, тип, номер последовательности, код операции, байты и т. д.)
- Контрольный код
- EOFrame
Неизменно полученные «славы» включают:
- хорошие - без проблем.
- Повреждено из-за того, что отправитель не отправил полное сообщение (оно зависло, выключено или прервало передачу при включении питания) (получатель должен таймаутить устаревшие неполные сообщения).
- Поврежден из-за шума или помех при передаче. (ошибки кадрирования байтов, четность, неверные данные)
- Поврежден из-за того, что приемник запускается в середине отправленного сообщения или отсутствует несколько байтов из-за переполнения входного буфера.
- Совместные столкновения автобусов.
- Перерыв - это законно в вашей системе?
Какой бы фрейм вы ни использовали, убедитесь, что он устойчив к этим типам сообщений, быстро проверяет #1 и быстро идентифицирует 2-5 и готов к следующему фрейму.
SOF имеет огромное преимущество: его легко начать заново, если приемник потерян из-за предыдущего дерьмового кадра и т. д.
Длина — это хорошо, но ИМХО наименее полезно. Это может ограничить пропускную способность, если длина должна быть в начале сообщения. Некоторые операции с малой задержкой просто не знают длину, прежде чем они будут готовы начать передачу.
CRC Рекомендуется более 2 байт. Короткий контрольный код для меня недостаточно улучшает ситуацию. Я бы предпочел не иметь контрольного кода, чем 1-байтовый. Если время от времени возникают ошибки, их можно поймать только с помощью контрольного кода, я хочу что-то лучше, чем 2-байтовый 99,999% времени, мне нравится 4-байтовый 99,99999997%
EOF очень полезен!
Кстати: если ваш протокол ASCII (вместо двоичного), рекомендуется не использовать cr
или lf
в качестве EOFrame. Возможно, используйте их только вне кадра, где они не являются частью сообщения.
Кстати 2: Если ваш приемник может автоматически определять скорость передачи, это избавляет от многих проблем с настройкой.
BTW3: отправитель может рассмотреть возможность отправки байта «ничего» (до SOF), чтобы обеспечить правильную синхронизацию SOF.
person
chux - Reinstate Monica
schedule
19.06.2013