Потоковая передача целочисленных данных из Arduino в Java, целое число больше 0xFF
Мне нужно отправить, сколько миллисекунд прошло с начала времени запуска arduino, на java с помощью Serial.write(). Однако самое большое целое число, которое я могу туда ввести, равно 255, естественно, поскольку наибольшее значение в 1 байт, которое мы можем отправить, равно 0xFF.
Но если у нас есть целое число, например 6000 миллисекунд, которое я хочу отправить в java, как я могу это сделать? Сначала я думал просто проверить, больше ли число 255, затем немного сдвинуть его на 4 влево, затем выполнить number<<4 & 0xFF00
, а также записать (number<<4)>>8 & 0xFF
Но
- это не работает для действительно больших чисел и
- Я полагаю, что когда я передаю эти значения int в Java, они считываются как символы...
как мне это исправить?
Обновление Я создал вторую версию следующим образом
void sendData(int a ){
while(a>0){
Serial.write(a&255);
a = a>>8;
}
}
на стороне Java я должен каким-то образом умножить правильный x на 16 ^ (x) на значение, которое мы получаем, поскольку все получено в обратном направлении, я не уверен, что это лучший способ, поскольку мы не обязательно знаем, сколько байтов мы получим
@John Rawls, 👍0
1 ответ
Лучший ответ:
Я предполагаю, что вы будете использовать функцию 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 и далее) частью вашего вывода.
- Java NetBeans отправляет значение и получает значение от Arduino
- Просто сомнение по поводу свечения светодиода
- Печать string and integer LCD
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Отправьте несколько значений int из Python в Arduino, используя pySerial
- Глобальные переменные занимают много места в динамической памяти.
- (Код ультразвукового датчика: такого файла или каталога нет)