Если вы отправляете пары целых или любое количество байтов, возможно, вы захотите рассмотреть простой последовательный протокол.Здесь есть несколько вопросов, касающихся протоколов последовательных команд для встроенных систем, например:
- Как вы разрабатываете протокол последовательных команд для встроенной системы?
- Простой последовательный протокол двухточечной связи
Одно из предложений - начинать ваше сообщение с байта заголовка, обычно, если это возможно, вне диапазона данных (> 90в твоем случае?).Следующий код не был проверен;это всего лишь идея, но она должна выполняться.
int lookingForHeader = 1;
int lookingForByteOne = 0;
int lookingForByteTwo = 0;
while (myPort.available() > 0) {
while (lookingForHeader == 1) {
int header = myPort.read();
if (header == HEADER_BYTE) {
lookingForHeader = 0;
lookingForByteOne = 1;
}
// Consider incrementing a counter here and timing out if it gets too large.
}
if (lookingForByteOne == 1) {
int byteOne = myPort.read();
// Check if byteOne is between 0 and 90.
lookingForByteOne = 0;
lookingForByteTwo = 1;
}
if (lookingForByteTwo == 1) {
int byteTwo = myPort.read();
// Check if byteTwo is between 0 and 90.
lookingforByteTwo = 0;
lookingForHeader = 1;
// Perhaps do a serial.write() here to acknowledge that
// a header and two bytes have been received.
// Finally, do stuff with byteOne and byteTwo.
}
}
Другой вариант - подтвердить получение каждого байта (т.е. получить заголовок, ответить специальным байтом «ack header», получить следующий байт, ответитьс "ack byte one" и т. д.).Это медленнее, но может подойти вам.
Наконец, пара ключевых моментов из вопросов, с которыми я связан выше:
Рассмотрите возможность отправки контрольной суммы (т. Е. Суммы байтов) в концесообщение.Arduino суммирует заголовок, байт 1 и байт 2. Если он не совпадает с контрольной суммой, он может ответить ошибкой или отправить сообщение снова.
Ответ Рекса на вопрос [2]резюмирует, как может выглядеть протокол сообщения:
// total packet length minus flags len+4
U8 sflag; //0x7e start of packet end of packet flag from HDLC
U8 cmd; //tells the other side what to do.
U8 len; // payload length
U8 payload[len]; // could be zero len
U16 crc;
U8 eflag; //end of frame flag