Способ преобразования потока байтов в поток пакетов в C89 на встроенном устройстве [закрыт]
-
03-07-2019 - |
Вопрос
Я работаю со встроенным устройством, которое подключено к ПК с помощью rs232 (rs232 через USB).
Я подумываю о разработке своего собственного протокола:
<MAGIC><LENGTH><BINARY DATA><CRC>
но я не хочу изобретать велосипед заново.
Пожалуйста примечание это:Я думаю о довольно ограниченном устройстве:4 кб оперативной памяти, ни ядра, ни стандартной библиотеки C.
Можете ли вы подумать о стандартном способе сделать это (возможно, библиотека с открытым исходным кодом)?
Если вы кодируете свое собственное решение, есть ли у вас какие-либо рекомендации?
- Используете ли вы ВОЛШЕБНЫЕ байты также в конце пакетов?
- Может быть, лучше использовать временные промежутки вместо разделителей?
- Как вы находите начало пакетов в потоке двоичных данных?
- Может быть, лучше использовать текстовые протоколы?
Обновить: Пожалуйста, перечитайте вопрос.Я должен просить не о библиотеке, а о хороших практиках.
Решение
Видишь этот ответ я дал на очень похожий вопрос что касается деталей простого протокола.
Чтобы ответить на ваши конкретные замечания:
- "Волшебные" байты в конце пакетов не наносят никакого вреда, но они избыточны, если вы уже знаете, какой длины должен быть пакет, и у вас есть CRC.
- Может быть разумно указать время ожидания, поэтому, если между байтами в одном пакете слишком большой разрыв, то помечается ошибка.Использовав Модбус, Я не убежден в ценности использования разделителей, основанных на времени, в других местах.
- Вы имеете в виду, "как вы находите начало пакетов в потоке двоичных данных"?Если это так, возможно, укажите минимальный интервал между пакетами и / или требуйте от получателя подтверждения после каждого пакета.
- Упрощает отладку и не требует какого-либо специального программного обеспечения на ПК, но не очень эффективно.Конечно, если удобство использования важнее эффективности, то система, основанная на тексте, вполне уместна.
Другие советы
Для чего-то подобного к тому времени, когда вы получите существующее решение для работы на вашем устройстве, было бы проще просто изобрести велосипед.
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.Там есть отличная статья с кодом, здесь.