Оскільки асинхронний послідовний зв’язок широко поширений серед електронних пристроїв навіть в наш час, я вважаю, що багато з нас час від часу стикаються з таким питанням. Розгляньте електронний пристрій D
та комп’ютер, PC
підключений до послідовної лінії (RS-232 або подібний) і необхідний для постійного обміну інформацією . Тобто PC
кожен надсилає командний кадр X ms
і D
відповідає кожним звітом про стан / кадром телеметрії Y ms
(Звіт можна надсилати як відповідь на запити або самостійно - тут насправді не має значення). Кадри зв'язку можуть містити будь-які довільні двійкові дані . Припускаючи, що кадри зв'язку є пакетами фіксованої довжини.
Проблема:
Оскільки протокол є безперервним, приймаюча сторона може втратити синхронізацію або просто "приєднатися" посередині поточного відправленого кадру, тому вона просто не буде знати, де починається кадр (SOF). Дані мають різний зміст, виходячи зі свого положення відносно SOF, отримані дані будуть зіпсовані, можливо, назавжди.
Необхідне рішення
Надійна схема розмежування / синхронізації для виявлення SOF з коротким часом відновлення (тобто для повторної синхронізації не повинно зайняти більше, скажімо, 1 кадр).
Існуючі методи, які я знаю (і використовую деякі):
1) Заголовок / контрольна сума - SOF як задане значення байта. Контрольна сума в кінці кадру.
- Плюси: просто.
- Мінуси: Не надійно. Невідомий час відновлення.
2) Набивання байтів:
- Плюси: надійне, швидке відновлення, його можна використовувати з будь-яким обладнанням
- Мінуси: не те, що підходить для комунікації на основі кадрів фіксованого розміру
3) 9-й бітний маркування - додайте кожен байт додатковим бітом, тоді як SOF 1
і байти даних позначені 0
:
- Плюси: надійне, швидке відновлення
- Мінуси: Потрібна технічна підтримка. Не підтримується безпосередньо більшості
PC
апаратних та програмних засобів.
4) Маркування 8-го біту - вид емуляції вищезазначеного, при цьому використовується 8-й біт замість 9-го, який залишає лише 7 біт для кожного слова даних.
- Плюси: надійне, швидке відновлення, його можна використовувати з будь-яким обладнанням.
- Мінуси: Потрібна схема кодування / декодування від / до звичайного 8-бітного представлення до / від 7-бітного представлення. Дещо марнотратний.
5) На основі тайм-ауту - прийняти SOF як перший байт, що надходить після певного визначеного часу очікування.
- Плюси: Без накладних даних, просто.
- Мінуси: Не так надійно. Не буде добре працювати з поганими системами синхронізації, наприклад, Windows PC. Потенційна пропускна здатність.
Питання: Які інші можливі методи / рішення існують для вирішення проблеми? Чи можете ви вказати на мінуси у наведеному вище списку, які можна легко обробити, тим самим усуваючи їх? Як ви (або ви б) проектували ваш системний протокол?