Упаковка / распаковка нескольких целых от обработки до Arduino через последовательную библиотеку - PullRequest
1 голос
/ 03 марта 2012

Я успешно отправил отдельные значения int из Processing в Arduino, но теперь мне нужно отправить пару целых чисел (оба значения имеют значения от 0 до 90) вместе, и я не уверен, как это сделать.

Читая документы, я вижу, что могу отправлять byte/byte[]/int/char/String типы. Одна идея состоит в том, чтобы отправить строку, содержащую два целых числа, соединенных запятой, но я не уверен на 100%, как преобразовать данные в строку и разделить их в Arduino.

serial.write(intValue1+","+intValue2);

Другая вещь, о которой я думал, это как-то упаковывать два целых числа в byte[], но я мало работал с байтами, так что любые советы по началу работы были бы полезны.

1 Ответ

2 голосов
/ 03 марта 2012

Если вы отправляете пары целых или любое количество байтов, возможно, вы захотите рассмотреть простой последовательный протокол.Здесь есть несколько вопросов, касающихся протоколов последовательных команд для встроенных систем, например:

  1. Как вы разрабатываете протокол последовательных команд для встроенной системы?
  2. Простой последовательный протокол двухточечной связи

Одно из предложений - начинать ваше сообщение с байта заголовка, обычно, если это возможно, вне диапазона данных (> 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
...