Я бы использовал HDLC .Я имел удачу с этим в прошлом.Я бы для последовательного соединения просто использовал Асинхронное кадрирование и забыл обо всех других элементах управления, поскольку это, вероятно, было бы излишним.
В дополнение к использованию HDLC для кадрированияпакет.Я форматирую свой пакет следующим образом.Вот как параметры передаются с использованием 802.11
U8 cmd;
U8 len;
u8 payload[len];
Общий размер каждого пакета команд составляет len + 2
Затем вы определяете команды, такие как
#define TRIGGER_SENSOR 0x01
#define SENSOR_RESPONSE 0x02
ДругиеПреимущество состоит в том, что вы можете добавлять новые команды, и если вы правильно спроектируете свой синтаксический анализатор, чтобы игнорировать неопределенные команды, у вас будет некоторая обратная совместимость.
Поэтому, собрав все вместе, пакет будет выглядеть следующим образом.1018 *
Затем система будет следить за последовательным потоком для флага 0x7e, и когда он будет там, вы проверяете длину, чтобы увидеть, является ли он pklen> = 4 и pklen = len + 4, и является ли crc действительным.Примечание: не полагайтесь только на crc для небольших пакетов, вы получите много ложных срабатываний, также проверьте длину.Если длина или crc не совпадают, просто сбросьте длину и crc и начните с декодирования нового кадра.Если это совпадение, скопируйте пакет в новый буфер и передайте его в вашу функцию обработки команд.Всегда сбрасывайте длину и crc при получении флага.
Для функции обработки вашей команды возьмите cmd и len, а затем используйте переключатель для обработки каждого типа команды.Мне также требуется, чтобы определенные события отправляли ответ, поэтому система ведет себя как удаленный вызов процедуры, управляемый событиями.
Так, например, сенсорное устройство может иметь таймер или отвечать на команду, чтобы выполнить чтение.Затем он отформатирует пакет и отправит его на ПК, и ПК ответит, что получил пакет.В противном случае сенсорное устройство может повторно отправиться по тайм-ауту.
Также, когда вы выполняете передачу по сети, вы должны проектировать его как сетевой стек, такой как OSI modle .HDLC - это канальный уровень , а RPC и обработка команд - прикладной уровень .
.