Існує маса способів написання послідовного протоколу в залежності від того, яку функціональність ви хочете отримати і скільки перевірки помилок вам потрібно.
Деякі найпоширеніші речі, які ви бачите в протоколах до точки:
Кінець повідомлення
Найпростіші протоколи ASCII просто закінчують послідовність символів повідомлення, часто \r
або так, \n
як це друкується при натисканні клавіші введення. Бінарні протоколи можуть використовувати 0x03
або інший загальний байт.
Початок повідомлення
Проблема лише з закінченням повідомлення полягає в тому, що ви не знаєте, які інші байти вже отримані під час надсилання повідомлення. Потім ці байти будуть префіксними для повідомлення та спричинити його неправильне тлумачення. Наприклад, якщо Arduino просто прокинувся зі сну, у серійному буфері може бути сміття. Щоб обійти це, у вас є початок послідовності повідомлень. У вашому прикладі ^
, у двійкових протоколах часто0x02
Помилка перевірки
Якщо повідомлення може бути пошкоджено, нам потрібна перевірка помилок. Це може бути контрольна сума чи помилка CRC чи щось інше.
Втеча персонажів
Можливо, контрольна сума додає до керуючого символу, такого як байт "початок повідомлення" або "кінець повідомлення", або повідомлення містить значення, рівне контрольному символу. Рішення полягає у введенні символу втечі. Символ втечі розміщується перед модифікованим символом управління, щоб фактичний символ управління не був присутній. Наприклад, якщо початковий символ дорівнює 0x02, використовуючи символ втечі 0x10, ми можемо надіслати значення 0x02 у повідомленні як пара байтів 0x10 0x12 (байтовий символ управління XOR)
Номер пакету
Якщо повідомлення пошкоджене, ми можемо попросити повторне надсилання або повторне повідомлення, але якщо було надіслано кілька повідомлень, може бути відтворено лише останнє повідомлення. Замість цього пакету можна надати номер, який перекидається після певної кількості повідомлень. Наприклад, якщо це число 16, передавальний пристрій може зберігати останні 16 відправлених повідомлень, і якщо такі були пошкоджені, приймаючий пристрій може запросити повторне використання, використовуючи номер пакета.
Довжина
Часто в двійкових протоколах ви бачите байт довжини, який повідомляє пристрою, що приймає, скільки символів у повідомленні. Це додає ще один рівень перевірки помилок, як якщо б не було отримано правильну кількість байтів, то сталася помилка.
Ардуїно специфічний
Придумуючи протокол для Arduino, перший погляд на те, наскільки надійний канал зв'язку. Якщо ви надсилаєте більшість бездротових носіїв інформації, XBee, WiFi тощо, тут уже вбудовані перевірки помилок та повторні спроби, і, таким чином, немає сенсу вносити їх у свій протокол. Якщо ви відправляєте через RS422 за пару кілометрів, тоді це знадобиться. Що я б включив - це початок повідомлення та кінець символів повідомлення, як у вас є. Моя типова реалізація виглядає приблизно так:
>messageType,data1,data2,…,dataN\n
Розмежування частин даних комою дозволяє легко розбирати, а повідомлення надсилається за допомогою ASCII. Протоколи ASCII чудові тим, що ви можете вводити повідомлення на послідовний монітор.
Якщо ви хочете двійкового протоколу, можливо, щоб скоротити розміри повідомлень, вам доведеться здійснити перехід, якщо байт даних може бути таким же, як і байт керування. Бінарні керуючі символи краще для систем, де бажаний повний спектр перевірки помилок та повторних спроб. Корисне навантаження все ще може бути ASCII при бажанні.