Przede wszystkim nie Pan - Michał lub atmel jestem

Raczej ciężko będzie mi to bardziej szczegółowo omówić, gdyż jestem raczej słaby w tłumaczeniu, ale spróbuję

Ogólnie prawie każdy rodzaj transmisji cyfrowej opiera się na wysyłaniu, bądź też odbieraniu odpowiednich ramek danych (komend, zapytań i odpowiedzi). Nie mówię tutaj oczywiście o samej budowie ramki sprzętowej (dla RS232 są to: rozmiar pola danych, ewentualny bit parzystości, bit/y stopu), tylko o tzw. protokole.
Przechodząc do sedna, zakładamy, że mamy jedno urządzenie nadawcze, które co określony czas wysyła wartość zmierzonej temperatury oraz wilgotność powietrza, a kolejne (może być ich kilka) odbiera te dane i odpowiednio je interpretując wyświetla na LCD - coś na wzór stacji pogody. Kolejne założenie jest takie, że wartość temperatury może być z przedziału od 0 do 100*C (celowo nie uwzględniam wartości ujemnych oraz zmiennoprzecinkowych, żeby łatwiej było zrozumieć o co mi chodzi

), a wilgotność od 0 do 100%. Po krótkiej chwili zastanowienia możemy wpaść na pomysł, aby te informacje wysyłać naprzemiennie, ale jest to zgubne podejście i zaraz powiem dlaczego.
W takim razie nasza ramka może wyglądać następująco:
Kod:
TemperaturaWilgotność
027078 (27*C, 78%)
100001 (100*C, 1%)
000100 (0*C, 100%)
Wiadomo również, że te dane "lecą" jedne za drugimi, dlatego otrzymamy taki taśmociąg 027078100001. W naszych prostych rozważaniach nie istotnie są przerwy czasowe między takimi pakietami, chociaż w pewnych sytuacjach mają one kolosalne znaczenie i one również niosą ze sobą informację (omawiane w ostatnim czasie przez naszego Guru Mirka magiczne diody LED

).
W ten sposób za każdym razem musimy wysłać aż 6 znaków (bajtów) i na dodatek nie mamy żadnej kontroli, czy otrzymaliśmy poprawny zestaw danych. Pomijam również kwestie dotyczące detekcji/korekcji błędów (nie jestem w stanie wszystkiego opisać w jednym poście, a temat jest naprawdę niezwykle ciekawy i rozbudowany). Co będzie w przypadku, kiedy z jakiś względów utracimy np. 4 bajt w pierwszym pakiecie? Będzie "masakra"

- odbieramy wtedy:
Kod:
027781 (27*C, 781%)
000010 (0*C, 10%)
itd.
Jeśli nie mamy jakiś warunków saturacyjnych, czy też odrzucających błędne pomiary to później może być już tylko gorzej.
Utracenie danej może polegać na niezsynchronizowaniu urządzeń tj. najpierw włączamy nadajnik, a dopiero po chwili odbiornik, którego szanse na odebranie pierwszego bajtu temperatury są znikome, a uzyskane przesunięcie dramatycznie wnosi się na kolejne pakiety.
Trzeba jakoś temu zaradzić, dlatego decydujemy się na dodanie bajtów startu i stopu, czyli wysłaniu odpowiednich znaków na początku i końcu każdej ramki:
Kod:
[TemperaturaWilgotność]
[027078]
[100001]
[000100]
Co prawda nasz pakiecik rozrósł się o 2 bajty, ale za to mamy pewność, że odebrane informacje są poprawne. W efekcie jeżeli "zgubimy" jakikolwiek bajt danych np. [02778], wtedy taki pakiet w ogóle nie będzie brany po uwagę, bo zawiera błędy. W przypadku kiedy utracony zostanie znak '[' lub ']' postępujemy analogicznie i zakładamy, że dane są niepoprawne: [027078[100001] (pierwszy pakiet błędny, drugi OK).
Teraz przychodzi nam na myśl optymalizacja transmisji. Wiemy, że znaki początku i końca transmisji są niezbędne, więc pasuje zająć się samymi danymi. Nie będziemy już wysyłać szeregu znaków stanowiących kody ASCII cyfr, więc możemy skorzystać z transmisji binarnej, a mianowicie:
Kod:
[Liczba_0-100Liczba_0-100]
Nr bajtu: 1 2 3 4
[ ESC N ] (27*C, 78%)
[ d SOH ] (100*C, 1%)
gdzie ESC i SOH odpowiadają liczbom 27 i 1, zgodnie z tablicą kodów ASCII (
http://www.asciitable.com).
W ten sposób zamiast 8-miu bajtów mamy 4, jednak zmieniają się tym samym kwestie odbioru tych danych, ale moim zdaniem interpretacja danych binarnych jest dużo prostsza od analizowania znaków (mój pierwszy post w tym temacie).
Ostatecznie możemy zdecydować się na dowolne znaki Start/Stop np. na STX (2), ETX (3), co jest dużo bardziej powszechne w przypadku transmisji binarnej.
Chętnie rozwinę jakąś kwestię jeżeli ktoś byłby zainteresowany.