Dobry protokół/stos komunikacji szeregowej dla urządzeń wbudowanych? [zamknięte]

Po napisaniu kilku różnych niestandardowych protokołów szeregowych dla różnych projektów, zacząłem być sfrustrowany wynalezieniem koła za każdym razem. Zamiast rozwijać niestandardowe rozwiązania dla każdego projektu, Szukałem bardziej ogólnego rozwiązania. Zastanawiałem się, czy ktoś zna protokół szeregowy (albo jeszcze lepiej implementację), który spełnia następujące wymagania:

  • Obsługa wielu urządzeń. Chcielibyśmy móc obsługiwać RS485 autobus.
  • Gwarantowana dostawa. Jakiś mechanizm potwierdzenia i proste wykrywanie błędów (CRC16 jest chyba w porządku). Nie master / slave. Idealnie byłoby, gdyby slave (y) mógł wysyłać dane asynchronicznie. Jest to głównie ze względów estetycznych, pojęcie ankietowania każdego niewolnika nie wydaje mi się właściwe.
  • OS independence. Idealnie byłoby nie polegać na zapobiegawczym środowisku wielozadaniowości w ogóle. Jestem skłonny to przyznać, jeśli Mogę dostać drugi rzeczy.
  • ANSI C. musimy być w stanie skompilować go dla kilku różnych architektur.

Prędkość nie jest zbyt dużym problemem, jesteśmy gotowi zrezygnować z prędkości, aby zaspokoić niektóre z tych innych potrzeb. Chcielibyśmy jednak zminimalizować ilość wymaganych zasobów.

Mam zamiar zacząć implementować protokół przesuwanych okien z piggybacked ACKs i bez selektywnego powtarzania, ale pomyślałem, że może ktoś zaoszczędzi mi kłopotu. Czy ktoś wie istniejącego projektu, który mógłbym wykorzystać? A może lepsza strategia?

UPDATE
Poważnie rozważałem implementację TCP / IP, ale naprawdę miałem nadzieję na coś bardziej lekkiego. Wiele funkcji TCP / IP jest przesadnych dla tego, co próbuję zrobić. Jestem gotów zaakceptować (z żalem) , że być może funkcje, które chcę, po prostu nie są zawarte w protokołach lżejszych.

UPDATE 2
Dzięki za wskazówki dotyczące puszki. Patrzyłem na to w przeszłości i prawdopodobnie użyje go w przyszłości. Chciałbym jednak, aby Biblioteka zajmowała się potwierdzeniami, buforowaniem, ponownymi próbami itp. Myślę, że bardziej Szukam warstwy Sieci / Transportu zamiast warstwy łącza danych / warstwy fizycznej.

UPDATE 3
Więc wygląda na to, że stan techniki w tej dziedzinie jest:

  • przycięty stos TCP / IP. Prawdopodobnie zaczyna się od czegoś w rodzaju lwIP lub uIP .
  • implementacja oparta na CAN, it prawdopodobnie opierałaby się w dużej mierze na magistrali CAN, więc nie byłaby przydatna na innych warstwach fizycznych. Coś w rodzajumoże pomóc po drodze.
  • implementacja HDLC lub SDLC (jak ta ). To pewnie ta trasa, którą pojedziemy.

Prosimy o zamieszczenie więcej odpowiedzi, jeśli natkniesz się na to pytanie.

Author: dsolimano, 2009-07-21

6 answers

Rozważałeś HDLC lub SDLC ?

Istnieje również LAP / D (Link Access Protocol, D-Channel).

Uyless Black ' S " Data Link Protocols " jest zawsze w pobliżu na mojej półce z książkami - możesz tam znaleźć przydatne materiały (nawet przejrzeć TOC i zbadać różne protokoły)

 12
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-21 21:40:16

CAN spełnia szereg Twoich kryteriów:

  • Obsługa wielu urządzeń: obsługuje dużą liczbę urządzeń na jednej magistrali. Nie jest jednak kompatybilny z RS485.
  • Gwarantowana dostawa: warstwa fizyczna wykorzystuje bit-farsz i CRC, z których wszystkie są zaimplementowane w sprzęcie na coraz większej liczbie nowoczesnych procesorów wbudowanych. Jeśli potrzebujesz pomocy, to sam musisz to dodać.
  • nie master / slave: tam nie są panami ani niewolnikami; wszystkie urządzenia mogą nadawać, kiedy tylko chcą. Sprzęt procesora zajmuje się arbitrażem i sporami.
  • niezależność OS: Nie dotyczy; jest to magistrala niskiego poziomu. To, co na to włożysz, zależy od Ciebie.
  • ANSI C: Ponownie, Nie dotyczy.
  • Prędkość: zazwyczaj do 1 MB / S do 40 m; Możesz wybrać własną prędkość dla swojej aplikacji.

Jak już wspomniano, jego definicja jest dość niska, więc jest nadal pozostaje do zrobienia, aby przekształcić go w pełny protokół, aby spełnić twoje potrzeby. Jednak fakt, że wiele pracy jest wykonywana w sprzęcie dla Ciebie, czyni go bardzo przydatnym dla różnych aplikacji.

 5
Author: Steve Melnikoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-21 18:12:35

Myślę, że rozsądnym punktem wyjścia może być uIP .

(dodanie artykułu w Wikipedii na µIP ponieważ oryginalny link nie działa.)

 5
Author: Javier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-14 00:43:25

Spójrz na Profibus .

Jeśli nie chcesz master / slave, myślę, że powinieneś zrobić Arbitraż ze sprzętem (Canbus, FlexRay ).

 1
Author: KeyserSoze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-21 17:41:33

Rozważyłbyś protokół MODBUS? Jest zorientowany na master / slave, więc slave nie może zainicjować transferu, ale poza tym jest lekki do implementacji, wolny i dobrze obsługiwany przez narzędzia wysokiego poziomu. Powinieneś po prostu zrozumieć ich terminologię /jak rejestr trzymający, rejestr wejściowy, cewka wyjściowa itp.).

Poziom Phy może być RS232, RS485, Ethernet...

 1
Author: Drazen Cika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-24 15:41:39

Spójrz na sieć internetową mikrokontrolera (MIN):

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

Zainspirowany CAN, ale przy użyciu standardowego sprzętu UART, ze sprawdzaniem sumy kontrolnej i formatu ramki pod kątem wykrywania błędów i wypełnianiem bajtów do oznaczania nagłówka ramki.

 1
Author: Ken Tindell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-23 18:18:48