После написания нескольких различных пользовательских серийных протоколов для различных проектов, я начал разочаровываться в том, что каждый раз изобретаю колесо. Вместо продолжения разработки индивидуальных решений для каждого проекта, я искал более общее решение. Мне было интересно, знает ли кто-нибудь о серийном протоколе (или, еще лучше, реализации), который отвечает следующим требованиям:Хороший протокол последовательной связи/стек для встроенных устройств?
- Поддержка нескольких устройств. Мы хотели бы иметь возможность поддерживать шину 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). Это, вероятно, маршрут, который мы возьмем.
Пожалуйста, не стесняйтесь сообщать больше ответов, если вы столкнетесь с этим вопросом.
Yup, я видел это раньше, также этот: http://stackoverflow.com/questions/815758/simple-serial-point-to-point-communication-protocol Оба сосредоточены на относительно простых протокол. Я ищу что-то значительно более прочное и полнофункциональное. – Gabe
Вот пара подобных вопросов, чтобы вы начали. У вас больше требований, чем у тех, кто задал другие вопросы. 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
Как насчет TCP через PPP? – ChrisW