Способ преобразования потока байтов в поток пакетов в C89 на встроенном устройстве
Im работает со встроенным устройством, которое подключено к ПК с помощью rs232 (rs232 через USB).
Я думаю о разработке собственного протокола:
<MAGIC><LENGTH><BINARY DATA><CRC>
но я не хочу изобретать велосипед.
Пожалуйста, заметьте, что: Я думаю о довольно ограниченном устройстве: 4 КБ ОЗУ, ни ядре, ни стандартном C lib.
Вы можете подумать о стандартном способе сделать это (возможно, библиотеку с открытым исходным кодом)?
Если у вас есть собственное решение, у вас есть лучшие методы?
- Используете ли вы MAGIC байты в конце пакетов?
- Может быть, лучше использовать временные промежутки вместо разделителей?
- Как вы находите начало пакетов в двоичных данных потока?
- Может быть, лучше использовать текстовые протоколы?
UPDATE:
Пожалуйста, прочитайте вопрос. Я не должен просить библиотеку, но для хорошей практики.
Ответы
Ответ 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. Там отличная статья с кодом здесь.