Подтвердить что ты не робот

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

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

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

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

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

Пожалуйста, заметьте, что: Я думаю о довольно ограниченном устройстве: 4 КБ ОЗУ, ни ядре, ни стандартном C lib.

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

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

  • Используете ли вы MAGIC байты в конце пакетов?
  • Может быть, лучше использовать временные промежутки вместо разделителей?
  • Как вы находите начало пакетов в двоичных данных потока?
  • Может быть, лучше использовать текстовые протоколы?

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

4b9b3361

Ответ 1

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

Чтобы ответить на ваши конкретные вопросы:

  • "Магические" байты в конце пакетов не наносят никакого вреда, но они избыточны, если вы уже знаете, как долго должен быть пакет, и иметь CRC.
  • Может быть разумным указать время таймаута, поэтому, если между байтами внутри одного пакета слишком большой разрыв, тогда помечена ошибка. Используя Modbus, я не уверен в ценности использования разделителей времени в других местах.
  • Вы имеете в виду, "как вы находите начало пакетов в потоке двоичных данных"? Если это так, возможно, укажите минимальный разрыв между пакетами и/или требуйте, чтобы получатель получил acknolwedge после каждого пакета.
  • Делает это проще для отладки и не требует специального программного обеспечения на ПК, но не очень эффективно. Конечно, если юзабилити важнее эффективности, чем система на основе текста, вполне уместна.

Ответ 2

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

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, посмотрите в таблицу данных микроконтроллеров.

Ответ 3

О единственном, что есть за вашими примитивами ввода-вывода, будет расчет CRC. Там отличная статья с кодом здесь.