Потоковая передача целочисленных данных из Arduino в Java, целое число больше 0xFF

Мне нужно отправить, сколько миллисекунд прошло с начала времени запуска arduino, на java с помощью Serial.write(). Однако самое большое целое число, которое я могу туда ввести, равно 255, естественно, поскольку наибольшее значение в 1 байт, которое мы можем отправить, равно 0xFF.

Но если у нас есть целое число, например 6000 миллисекунд, которое я хочу отправить в java, как я могу это сделать? Сначала я думал просто проверить, больше ли число 255, затем немного сдвинуть его на 4 влево, затем выполнить number<<4 & 0xFF00, а также записать (number<<4)>>8 & 0xFF

Но

  1. это не работает для действительно больших чисел и
  2. Я полагаю, что когда я передаю эти значения int в Java, они считываются как символы...

как мне это исправить?

Обновление Я создал вторую версию следующим образом

void sendData(int a ){
  while(a>0){
    Serial.write(a&255);
    a = a>>8;
  }
}

на стороне Java я должен каким-то образом умножить правильный x на 16 ^ (x) на значение, которое мы получаем, поскольку все получено в обратном направлении, я не уверен, что это лучший способ, поскольку мы не обязательно знаем, сколько байтов мы получим

, 👍0


1 ответ


Лучший ответ:

2

Я предполагаю, что вы будете использовать функцию Arduino millis () для учета времени. Выходные данные функции millis() в среде Arduino представляют собой 32-разрядное целое число без знака*.

32-разрядное целое число может быть разбито на 4 x 8-битных байта. Чтобы все было проще, вы могли бы запрограммировать принимающую сторону Java так, чтобы она всегда ожидала 4 байта (или любое другое количество, которое вам нужно, см. *). Предполагая, что 32 бита достаточно, вы можете использовать следующее:

void sendData (uint32_t uptime) {
    int i;
    for (i = 0; i < 4; i++) {
        Serial.write (uptime & 255);
        uptime = uptime >> 8;
    }
}

На стороне Java вы сначала получили бы байт младшего порядка, и вы могли бы восстановить 32-битное значение, взяв первое полученное 8-битное значение, добавив второе значение, сдвинутое влево на 8 бит (= умноженное на 256), добавив третье значение, сдвинутое влево на 16 бит (=умноженное на 65536) и добавление четвертого значения, сдвинутого влево на 24 бита (= умноженное на 16777216). Java не является моей сильной стороной, поэтому я оставлю это на ваше усмотрение.

Кстати, есть ли какая-то особая причина, по которой вы должны использовать Serial.write()? Было бы намного проще просто записать значение в виде строки с помощью Serial.println().

*После 2 ^ 32 миллисекунд (чуть менее 50 дней безотказной работы) 32-разрядный счетчик, который передает данные функции millis(), обернется вокруг 0. Вы могли бы сохранить количество переполнений таймера в отдельной (целочисленной) переменной и сделать это (т.е. байты 5 и далее) частью вашего вывода.

,