Способ преобразования потока байтов в поток пакетов в C89 на встроенном устройстве [закрыт]

StackOverflow https://stackoverflow.com/questions/815029

  •  03-07-2019
  •  | 
  •  

Вопрос

Я работаю со встроенным устройством, которое подключено к ПК с помощью rs232 (rs232 через USB).

Я подумываю о разработке своего собственного протокола:

<MAGIC><LENGTH><BINARY DATA><CRC>

но я не хочу изобретать велосипед заново.

Пожалуйста примечание это:Я думаю о довольно ограниченном устройстве:4 кб оперативной памяти, ни ядра, ни стандартной библиотеки C.

Можете ли вы подумать о стандартном способе сделать это (возможно, библиотека с открытым исходным кодом)?

Если вы кодируете свое собственное решение, есть ли у вас какие-либо рекомендации?

  • Используете ли вы ВОЛШЕБНЫЕ байты также в конце пакетов?
  • Может быть, лучше использовать временные промежутки вместо разделителей?
  • Как вы находите начало пакетов в потоке двоичных данных?
  • Может быть, лучше использовать текстовые протоколы?

Обновить: Пожалуйста, перечитайте вопрос.Я должен просить не о библиотеке, а о хороших практиках.

Это было полезно?

Решение

Видишь этот ответ я дал на очень похожий вопрос что касается деталей простого протокола.

Чтобы ответить на ваши конкретные замечания:

  1. "Волшебные" байты в конце пакетов не наносят никакого вреда, но они избыточны, если вы уже знаете, какой длины должен быть пакет, и у вас есть CRC.
  2. Может быть разумно указать время ожидания, поэтому, если между байтами в одном пакете слишком большой разрыв, то помечается ошибка.Использовав Модбус, Я не убежден в ценности использования разделителей, основанных на времени, в других местах.
  3. Вы имеете в виду, "как вы находите начало пакетов в потоке двоичных данных"?Если это так, возможно, укажите минимальный интервал между пакетами и / или требуйте от получателя подтверждения после каждого пакета.
  4. Упрощает отладку и не требует какого-либо специального программного обеспечения на ПК, но не очень эффективно.Конечно, если удобство использования важнее эффективности, то система, основанная на тексте, вполне уместна.

Другие советы

Для чего-то подобного к тому времени, когда вы получите существующее решение для работы на вашем устройстве, было бы проще просто изобрести велосипед.

void buffer_packet(unsigned char rx_byte)
{
    static unsigned char byte_count = 0;
    static unsigned char packet[8];

    packet[byte_count++] = rx_byte;
    if (byte_count == 8)
    {
        unsigned char crc = calculate_crc(packet, 8);

        write_uart(0x55);
        write_uart(8);
        while (byte_count--)
        {
            write_uart(packet[7 - byte_count]);
        }
        write_uart(crc);
    }
}

Или, может быть, я недооцениваю вашу проблему.Если вы ищете, как сгенерировать биты RS232, загляните в ваше техническое описание микроконтроллеров.

Пожалуй, единственное, что есть за пределами ваших примитивов ввода-вывода, - это вычисление CRC.Там есть отличная статья с кодом, здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top