Dobre protokoły oparte na RS232 dla komunikacji wbudowanej w komputer

10

Pracuję nad projektem, który wymaga dobrej komunikacji danych między zdalnym Arduino a komputerem. Połączenie bezprzewodowe odbywa się za pomocą pary XBees, więc mamy połączenie RS232 między Arduino i komputerem. W przypadku małych ilości danych łatwo jest połączyć prosty protokół komunikacyjny. W przypadku większych projektów, jakie są dobre proste protokoły komunikacyjne?

Patrzyłem na MODBUS, który wydaje się realną opcją, ale chciałem sprawdzić, czy istnieją inne lepsze opcje.

Komputerowy
źródło
2
Jakie dokładnie są wymagania?
Szukasz ogólnych sugestii. Prostota i niskie koszty ogólne byłyby głównymi celami projektu.
Computerish
1
Przepraszam, miałem również na myśli: ile danych, jak szybko
Nie mam na to miar ilościowych, ale niewiele, a szybkość nie jest wielkim problemem.
Computerish
7
Niewiele i szybkość, która nie jest problemem, zdecydowanie przemawiają za czymś czytelnym dla człowieka, ponieważ znacznie ułatwia programowanie i debugowanie. Wspaniale jest, gdy możesz podłączyć terminal i zastąpić siebie dowolnym końcem łącza.
Chris Stratton

Odpowiedzi:

4

OP prosi o protokół szeregowy w sytuacji, gdy „ nie ma dużo [danych], a szybkość nie jest wielkim problemem ”. MODBUS jest wspomniany w OP MODBUS przez RS-485 nie jest szybkim protokołem. Chociaż nie jest to specyfikacja, daje to wyobrażenie o niszy.

Mogę wymyślić tylko dwa wspólne standardowe protokoły dla tej niszy:

  • NEMA 0183 . Protokół ASCII w postaci zwykłego tekstu. Czytelny dla człowieka. Tylko punkt-punkt. Nie obsługuje magistrali wielopunktowej.
  • MODBUS, o którym wspomniano już w PO

Bardzo często, gdy wbudowani programiści znajdują się w takiej sytuacji jak OP, projektują od zera własne protokoły komunikacji szeregowej.

Nick Alexeev
źródło
10

Niektóre protokoły systemów wbudowanych, niektóre z nich niezwykle proste, są wymienione na stronie Embedded Systems: Common Protocols , w tym:

Być może jeden z tych protokołów byłby odpowiedni dla obecnej aplikacji lub z drobnymi poprawkami.

Davidcary
źródło
6

Głosowałbym, żeby rzucić własne i uprościć to tak prosto, jak to możliwe.

Mam do czynienia z dużą ilością protokołów szeregowych do różnych zastosowań sterowania, a kilka rzeczy, które można polecić dołączyć to:

  • Rozpocznij i zatrzymaj znaki, które nie są używane gdzie indziej
  • Jakaś kontrola sumy kontrolnej / błędu
  • Pewna metoda kontroli / sygnalizacji przepływu, szczególnie jeśli potrzebujesz komunikacji dwukierunkowej.

Jako bardzo prosty przykład możesz przekonwertować swoje dane na znaki ASCII i umieścić je w znakach start / stop w następujący sposób:

Aby wysłać wartość bajtu 0x7A, przesyłane dane to (7A), gdzie () to wybrane znaki start / stop, a 7 i A to dwa znaki ascii. OK, to dodaje dużo narzutu, ale oznacza to, że możesz debugować za pomocą podstawowego oprogramowania terminala.

John U
źródło
5

Jeśli twoje dane przechodzą przez XBees, powinieneś przełączyć moduły w tryb API ze znakami zmiany znaczenia, podzielić dane na pakiety logiczne i skorzystać z faktu, że w trybie API pakiet, który jest przekazywany do XBee, albo dotrze nienaruszony, albo Ani trochę. Zaprojektuj swój protokół wokół transmisji fragmentów 1-255 bajtów i pozwól modułom XBee martwić się o sposób dostarczania danych w ramach każdego fragmentu. Nie martw się o utrzymanie integralności poszczególnych pakietów lub podziałów między nimi. Moduły Digi dobrze sobie z tym poradzą. Najważniejszą rzeczą, o którą musisz się martwić, jest fakt, że nawet jeśli węzeł, który przesyła pakiet, uważa, że ​​nie został dostarczony i wysyła zamiennik, odbiorca może i tak go otrzymać - być może nawet po otrzymaniu zastępstwa. Sprawy mogą być najłatwiejsze, jeśli zaprojektujesz swój protokół tak, aby jedna strona była „wzorcem”; jeśli master poprosi o kawałek danych, slave powinien wysłać go raz i nie martwić się o to, czy master go otrzyma. Jeśli master nie otrzyma potrzebnych danych, może zażądać ich ponownie.

Jednostka podporządkowana powinna przypisać dane do numerów sekwencji, a jednostka nadrzędna powinna przypisać numery sekwencji do żądań zmiany stanu urządzenia podrzędnego. Jeśli żądanie kapitana ma postać „wyślij pierwszy element, którego numer kolejny jest większy niż XXX”, a każdy element danych przez urządzenie slave zawiera swój własny numer kolejny i numer poprzedniego elementu (jeśli nie są ponumerowane kolejno ), późno przybywające pakiety mogą powodować, że niewolnik nadmiarowo wysyła dane do mastera, ale master nie będzie miał trudności zignorowaniem wynikających z tego opóźnionych odpowiedzi. Jeśli slave otrzyma żądanie zmiany stanu, którego numer sekwencji jest niższy niż numer wcześniejszego żądania, powinien zignorować to żądanie, ponieważ zostało ono zastąpione jeszcze przed jego otrzymaniem.

supercat
źródło
3

A co z Firmatą ? Obsługuje różne systemy operacyjne i języki programowania. Obsługiwane są Arduino i PICduino po stronie kontrolera, ale nie powinno to być zbyt trudne do przeniesienia do czystego mikrokontrolera.

jippie
źródło
3

Miałem podobne pytanie i nigdy nie znalazłem nic prostego i wystarczająco małego dla małych AVR itp. Więc stworzyłem coś zainspirowanego CAN. Nazywa się MIN (Microcontroller Interconnect Network):

https://github.com/min-protocol/min

Napisałem o tym tutaj blog:

https://kentindell.wordpress.com/2015/02/18/micrcontroller-interconnect-network-min-version-1-0/

Są tam haki na dane blokowe, ale są one głównie ukierunkowane na sygnały dla czujników / urządzeń wykonawczych. Zdefiniowałem format JSON do opisywania sygnałów i ich upakowania w ramkach MIN i mam nadzieję, że otrzymam sekretarz Wireshark, który go używa.

Ken Tindell
źródło