2009-07-21 3 views
35

После написания нескольких различных пользовательских серийных протоколов для различных проектов, я начал разочаровываться в том, что каждый раз изобретаю колесо. Вместо продолжения разработки индивидуальных решений для каждого проекта, я искал более общее решение. Мне было интересно, знает ли кто-нибудь о серийном протоколе (или, еще лучше, реализации), который отвечает следующим требованиям:Хороший протокол последовательной связи/стек для встроенных устройств?

  • Поддержка нескольких устройств. Мы хотели бы иметь возможность поддерживать шину RS485.
  • Гарантированная доставка. Какой-то механизм подтверждения и некоторое простое обнаружение ошибок (CRC16, вероятно, хорошо).
  • Не хозяин/раб. В идеале, ведомый (-ы) мог бы отправлять данные асинхронно. Это в основном только по эстетическим соображениям, понятие опроса каждого раба не кажется мне правильным.
  • Независимость от ОС. В идеале он не будет полагаться на упреждающую многозадачную среду вообще. Я согласен признать это, если смогу получить другой материал.
  • ANSI C. Нам нужно иметь возможность компилировать его для нескольких разных архитектур.

Скорость не слишком большая проблема, мы готовы отказаться от некоторой скорости, чтобы удовлетворить некоторые из этих потребностей. Однако мы хотели бы свести к минимуму количество требуемых ресурсов.

Я собираюсь приступить к реализации протокола с раздвижным окном с включенными ACK и без выборочного повтора, но подумал, что, возможно, кто-то может спасти меня. Кто-нибудь знает о существующем проекте, который я мог бы использовать? Или, может быть, лучшая стратегия?

UPDATE
Я серьезно рассмотрел реализацию TCP/IP, но действительно надеялся на что-то более легким. Многие из функций TCP/IP переполнены тем, что я пытаюсь сделать. Я готов принять (жалобно), что, возможно, функции, которые я хочу, просто не включены в более легкие протоколы.

ОБНОВЛЕНИЕ 2
Спасибо за советы по CAN. Я смотрел на него в прошлом и, вероятно, буду использовать его в будущем. Мне бы очень хотелось, чтобы библиотека обрабатывала подтверждения, буферизацию, повторы и т. Д. Наверное, я больше ищу сетевой/транспортный уровень вместо уровня данных/физического уровня.

UPDATE 3
Так это звучит как состояние техники в этой области:

  • подрезанный вниз TCP стек/IP. Вероятно, начиная с чего-то вроде lwIP или uIP.
  • Реализация на основе CAN, вероятно, будет сильно зависеть от шины CAN, поэтому она не будет полезна для других физических уровней. Что-то вроде CAN Festival может помочь по пути.
  • Реализация HDLC или SDLC (например, this one). Это, вероятно, маршрут, который мы возьмем.

Пожалуйста, не стесняйтесь сообщать больше ответов, если вы столкнетесь с этим вопросом.

+0

Yup, я видел это раньше, также этот: http://stackoverflow.com/questions/815758/simple-serial-point-to-point-communication-protocol Оба сосредоточены на относительно простых протокол. Я ищу что-то значительно более прочное и полнофункциональное. – Gabe

+0

Вот пара подобных вопросов, чтобы вы начали. У вас больше требований, чем у тех, кто задал другие вопросы. http://stackoverflow.com/questions/815758/simple-serial-point-to-point-communication-protocol http://stackoverflow.com/questions/310826/protocols-used-to-talk-between-an -embedded-cpu-and-acc – dwhall

+0

Как насчет TCP через PPP? – ChrisW

ответ

12

Считаете ли вы HDLC или SDLC?

Существует также LAP/D (Протокол доступа к каналу, D-канал).

Uyless Блэка «Data Link Protocols» всегда рядом на моей книжной полке - Вы могли бы найти полезный материал там тоже (даже пролистать исследования TOC & различные протоколы)

+0

Мне очень нравится внешний вид HDLC. Вы успешно использовали его в прошлом? – Gabe

5

Я бы предположил, что разумной отправной точкой может быть uIP.

+0

люблю это, это именно то, что я ищу. – Gabe

+0

Как я уже сказал ChrisW, мне бы хотелось пойти легче (если что-то существует). Полагаю, я всегда мог использовать uIP в качестве отправной точки и просто начать снимать материал. – Gabe

+0

в соответствии со страницей, он довольно модульный; поэтому вы можете использовать только IP-уровень и избавиться от TCP, UDP и всего выше. – Javier

1

Взгляните на Profibus.

Если вам не нужен мастер/ведомый, я думаю, что вы должны сделать арбитраж с оборудованием (Canbus, FlexRay).

+0

Хотелось бы избежать хозяина/раба, и если возможно, маркер кольцо. Раньше я никогда не реализовывал сеть Token Ring, но слышал плохие вещи. Я открыт для возможности использования CAN или FlexRay на уровне данных/физических уровнях. – Gabe

+1

Я бы не описал Profibus как легкий, не быстрый. –

+0

Я не думаю, что FlexRay подходит. FlexRay имеет свой собственный физический уровень и является синхронным. Его основной задачей является избыточная синхронизация часов, поэтому есть несколько мастеров. – starblue

5

CAN встречает ряд ваших критериев: несколько устройств

  • Поддержка: Он поддерживает большое количество устройств на одной шине. Однако он не совместим с RS485.
  • Гарантированная доставка: На физическом уровне используется бит-начинка и CRC, все из которых реализованы на аппаратных средствах во все большем числе современных встроенных процессоров. Если вам нужно acknlowedgement, вам нужно добавить это сверху.
  • Не хозяин/раб: Нет хозяев или рабов; все устройства могут передавать, когда захотят. Аппаратное обеспечение процессора связано с арбитражем и спорами.
  • Независимость от ОС: Не применимо; это низкоуровневая шина. То, что вы положили на это, зависит от вас.
  • ANSI C: Опять же, неприменимо.
  • Скорость: Обычно до 1 Мбит/с до 40 м; вы можете выбрать свою скорость для своего приложения.

Как уже упоминалось, его определение довольно низкоуровневое, поэтому еще предстоит проделать работу, чтобы превратить его в полный протокол для удовлетворения ваших потребностей. Однако тот факт, что большая часть работы выполняется для аппаратного обеспечения, делает ее очень полезной для различных приложений.

+0

Спасибо Стив, я смотрел на CAN в прошлом (и мне понравилось то, что я видел). Однако я действительно ищу логику более высокого уровня (подтверждение, буферизация и т. Д.). CAN является ОЧЕНЬ сильным соперником для физического/канала данных. Я действительно не смотрел на некоторые из проектов, таких как CANopen, которые затрагивают некоторые из этих проблем, хотя, безусловно, будут. – Gabe

1

ли вы рассмотреть протокол MODBUS? Он ориентирован на ведущий/ведомый, поэтому подчиненный не может инициировать передачу, но в остальном он облегчен для реализации, свободен и хорошо поддерживается инструментами высокого уровня. Вы должны просто понять их терминологию/например, регистр хранения, входной регистр, выходную катушку и т. Д.).

уровень Phy может быть RS232, RS485, Ethernet ...

1

Посмотрите на микроконтроллерах сети Интернет (МИН):

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

Вдохновленный CAN, но с использованием стандартных аппаратных UART, с Проверка контрольной суммы Флетчера и формата кадра для обнаружения ошибок и заполнения байтов для маркировки заголовка кадра.

Смежные вопросы