Ponieważ asynchroniczna komunikacja szeregowa jest obecnie szeroko rozpowszechniona wśród urządzeń elektronicznych, uważam, że wielu z nas od czasu do czasu napotyka takie pytanie. Rozważ urządzenie elektroniczne D
i komputer PC
podłączony do linii szeregowej (RS-232 lub podobny) i wymagane do ciągłej wymiany informacji . Tj. Wysyła PC
każdą ramkę poleceń X ms
i D
odpowiada każdą z raportem statusu / ramką telemetryczną Y ms
(raport może być wysłany jako odpowiedź na żądanie lub niezależnie - tutaj tak naprawdę nie ma znaczenia). Ramki komunikacyjne mogą zawierać dowolne dane binarne . Zakładając, że ramki komunikacyjne są pakietami o stałej długości.
Problem:
Ponieważ protokół jest ciągły, strona odbierająca może utracić synchronizację lub po prostu „dołączyć” w środku wysyłanej ramki, więc po prostu nie będzie wiedział, gdzie jest początek ramki (SOF). Dane mają inne znaczenie w zależności od ich pozycji względem SOF, otrzymane dane zostaną uszkodzone, potencjalnie na zawsze.
Wymagane rozwiązanie
Niezawodny schemat ograniczania / synchronizacji do wykrywania SOF z krótkim czasem odzyskiwania (tj. Nie powinno to zająć więcej niż, powiedzmy, 1 ramka, aby ponownie zsynchronizować).
Istniejące techniki, które znam (i używam):
1) Nagłówek / suma kontrolna - SOF jako predefiniowana wartość bajtu. Suma kontrolna na końcu ramki.
- Plusy: proste.
- Minusy: niewiarygodne. Nieznany czas odzyskiwania.
2) Wypychanie bajtów:
- Plusy: niezawodne, szybkie odzyskiwanie, można go używać z dowolnym sprzętem
- Wady: Nie nadaje się do komunikacji opartej na ramkach o stałym rozmiarze
3) Oznaczenie 9-go bitu - dodaj każdy bajt dodatkowym bitem, podczas gdy SOF jest oznaczony, 1
a bajty danych są oznaczone 0
:
- Plusy: niezawodne, szybkie odzyskiwanie
- Minusy: Wymaga wsparcia sprzętowego. Nieobsługiwany bezpośrednio przez większość
PC
sprzętu i oprogramowania.
4) Oznakowanie 8-go bitu - rodzaj emulacji powyższego, przy użyciu 8-go bitu zamiast 9-tego, co pozostawia tylko 7 bitów na każde słowo danych.
- Plusy: niezawodne, szybkie odzyskiwanie, można go używać z dowolnym sprzętem.
- Wady: Wymaga schematu kodowania / dekodowania z / do konwencjonalnej reprezentacji 8-bitowej do / z reprezentacji 7-bitowej. Nieco marnotrawstwo.
5) Na podstawie limitu czasu - załóż SOF jako pierwszy bajt następujący po określonym czasie bezczynności.
- Plusy: brak narzutu danych, proste.
- Minusy: Nie tak niezawodny. Nie działa dobrze w przypadku słabych systemów pomiaru czasu, takich jak np. Komputer z systemem Windows. Potencjalny narzut przepustowości.
Pytanie: Jakie są inne możliwe techniki / rozwiązania mające na celu rozwiązanie problemu? Czy możesz wskazać wady na powyższej liście, które można łatwo obejść, usuwając je w ten sposób? Jak (lub chciałbyś) zaprojektować protokół systemowy?