передача числа типа double через Serial.write в Processing
- Войдите на сайт для отправки комментариев
Ср, 22/07/2020 - 14:06
Добрый день, Форумчане,
Делаю вывод с Arduino на экран ПК через Processing... Графики и всё такое.
И встал вопрос о передаче числа типа double
Проще говоря
double peak = вызов функции
Serial.write(peak);
На стороне Processing кроме этого числа перед этим передаются ещё 128 байт инфы.
Чтобы обеспечить надёжный приём переданного все данные считываются в один массив одной командой
inBuffer = int( port.readBytes() );
читаю буфер и вижу там 4 байта переданного числа peak.
вопрос - как мне без долгих экспериментов собрать его обратно в double? где там старший а где младший байт итп?
Заранее благодарен
для начала - в ардуино нет double. точнее double и float одно и то же
можете код процессинга привести полностью? Что это за строчка такая странная?
inBuffer = int( port.readBytes() );
добавка - эту строчку нашел
Если просто результат, то число нужно передавать в виде читаемой человеком строки.
Если просто результат, то число нужно передавать в виде читаемой человеком строки.
либо преобразовывать в целое, например умножением на 100 - а после получения в процессинге делить на 100 обратно
А так чтобы из четырех байт машинного представления float собрать исходное число - в процессинге таких возможностей не вижу
Если просто результат, то число нужно передавать в виде читаемой человеком строки.
либо преобразовывать в целое, например умножением на 100 - а после получения в процессинге делить на 100 обратно
А так чтобы из четырех байт машинного представления float собрать исходное число - в процессинге таких возможностей не вижу
Почему - простым умножением в float каждый байт умножается на свой множитель кратный 2 и складывается с предыдущим в одно число FLOAT.
МНЕ ЕДИНСТВЕННОЕ ЧТО НЕ ПОНЯТНО И НИ ГДЕ НЕ НАПИСАНО В КАКОМ ПОРЯДКЕ ВЫГРУЖАЕТСЯ число тип double в сериальный порт!!??
для начала - в ардуино нет double. точнее double и float одно и то же
можете код процессинга привести полностью? Что это за строчка такая странная?
inBuffer = int( port.readBytes() );
добавка - эту строчку нашел
Что значит нет double,
а это тогда что: http://arduino.ru/Reference/Double
Короче мне нужно понять при выгрузке такого числа в сериальный порт первым идёт старший или младший байт из 4-х???
Почему - простым умножением в float каждый байт умножается на свой множитель кратный 2 и складывается с предыдущим в одно число FLOAT.
похоже что вы с лонгом попутали
Что значит нет double, а это тогда что: http://arduino.ru/Reference/Double
а вы по этой ссылке внимательно читайте
так проверьте, варианта то всего два :)
Почему - простым умножением в float каждый байт умножается на свой множитель кратный 2 и складывается с предыдущим в одно число FLOAT.
похоже что вы с лонгом попутали
Что значит нет double, а это тогда что: http://arduino.ru/Reference/Double
а вы по этой ссылке внимательно читайте
так проверьте, варианта то всего два :)
Ну видимо придётся поэксперементировать...
Странно что в описаниях языка про это ничего не сказано... нек. вещи опущены - дагадайся сам... :((
Странно что в описаниях языка про это ничего не сказано... нек. вещи опущены - дагадайся сам... :((
А зачем кто-то будет описывать несуществующий экзмепляр write?
Странно что в описаниях языка про это ничего не сказано... нек. вещи опущены - дагадайся сам... :((
в описании какого языка ищете? - ищите в С++, а не "в ардуино"
А мне казалось, что порядок следования байт определяется архитектурой МК.
Странно что в описаниях языка про это ничего не сказано... нек. вещи опущены - дагадайся сам... :((
в описании какого языка ищете? - ищите в С++, а не "в ардуино"
Хорошая идея...!
вот, читайте. Может придет понимание, что ваша идея с домножением байт на степени двойки несколько из другой оперы
https://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB
ему для начала стоит понять, что вообще представляет флоат "изнутри", а то он явно его с лонгом путает
вот, читайте. Может придет понимание, что ваша идея с домножением байт на степени двойки несколько из другой оперы
https://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB
Круто... не сразу понял что не всё так просто...
Буду думать как собрать обратно.
Но... есть же функции сдвига >>
Всё что нужно обратно водворить на место все 4 байта числа!!!
вот, читайте. Может придет понимание, что ваша идея с домножением байт на степени двойки несколько из другой оперы
https://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB
Кстати
Круто... не сразу понял что не всё так просто...
Буду думать как собрать обратно.
Но... есть же функции сдвига >>
Всё что нужно обратно водворить на место все 4 байта числа!!!
Кстати ссылка не открывается
Кстати ссылка не открывается
просто в гугле наберите что-нибудь типа "внутреннее представление float" - таких статей много
Для слепых повторю
несуществующий экзмепляр write
Для слепых повторю
несуществующий экзмепляр write
Не понял что это и откуда и где пишет??
Я говорил про Serial.write(число); http://arduino.ru/Reference/Serial/Write
см по ссылке
Я говорил про Serial.write(число); http://arduino.ru/Reference/Serial/Write
см по ссылке
вы бы для начала сами внимательно прочитали то, что по вашей ссылке. Попытайтесь найти в описании хоть что-нибудь про float, а когда не найдете - задумайтесь почему
Я говорил про Serial.write(число); http://arduino.ru/Reference/Serial/Write
см по ссылке
вы бы для начала сами внимательно прочитали то, что по вашей ссылке. Попытайтесь найти в описании хоть что-нибудь про float, а когда не найдете - задумайтесь почему
Да и я тоже смотрел... только байт или массив.
Но... я проверял ручками - при отправке числа напрмер 51.545 = в буфере принимается 4 байта. первый из которых читается как 51 !!!
тем не менее я нашёл пост про передачу Float: Добрый день! Нужна помощь с получением float через USART. Написал вот такие программки:
С# на ПК. Она отправляет float и принимает это же число от ардуино уно
Код на ардуинке:
float number = 0;
union
{
uint32_t asByte;
float asFloat;
} message_float;
void setup()
{
Serial.begin(9600);
pinMode(2, OUTPUT);
}
void return_float_number()
{
uint32_t s = (message_float.asByte >> 31) ? -1 : 1; // Определяем знак
uint32_t e = (message_float.asByte >> 23) & 0xFF; // Порядок
uint32_t m =
e ?
( message_float.asByte & 0x7FFFFF ) | 0x800000 :
( message_float.asByte & 0x7FFFFF ) << 1;
number = s * (m*2^ -23)*(2^(e-127));
}
void loop()
{
for(uint8_t start = 0; start < 5; start++)
{
uint8_t simvol_read = Serial.read();
while(simvol_read == -1) {simvol_read = Serial.read();}
message_float.asByte = simvol_read >> 8;
//if (simvol_read != -1) {message_float.asByte = simvol_read << 8;}
if (start == 4)
{
return_float_number();
Serial.println(number);
//Serial.println(number);
if (number == 45.5) {digitalWrite(2, HIGH);}
}
}
}
Вот то что я получаю(отрывок):
8,035656E-09
4,120368E-11
6,797966E-33
6,825459E-07
5,429218E-31
1,097891E-05
6,409409E-10
4,244787E-05
6,337645E-10
8,035656E-09
а нужно получить обратно свои 45.5
P.S код получился запутанным потому что я много как пробовал. Помогите разобраться
Я говорил про Serial.write(число); http://arduino.ru/Reference/Serial/Write
см по ссылке
вы бы для начала сами внимательно прочитали то, что по вашей ссылке. Попытайтесь найти в описании хоть что-нибудь про float, а когда не найдете - задумайтесь почему
Извините за глупый вопрос - а вот "альтернативные" типы данных например uint32_t
в сегодняшней версии Arduino IDE работает вообще??
Мне кажется я уже пробовал компилить проги с такими типами и IDE выдавала ошибку типа не знаю что это
Извините за глупый вопрос - а вот "альтернативные" типы данных например uint32_t
в сегодняшней версии Arduino IDE работает вообще??
работают
тем не менее я нашёл пост про передачу Float...
Хороший пост нашли.
принцип, что изложен в ответе Igor68, что вы привели - совершенно верный, именно так и стоит действовать. Но я не уверен, может ли Процессинг работать с отдельными байтами, входящими в float
Мне кажется я уже пробовал компилить проги с такими типами и IDE выдавала ошибку типа не знаю что это
Потому что надо подключить stdint.h
Мне кажется я уже пробовал компилить проги с такими типами и IDE выдавала ошибку типа не знаю что это
Потому что надо подключить stdint.h
а у меня и без хидера собирается (если речь про ардуино)
а у меня и без хидера собирается (если речь про ардуино)
Да, сейчас проверил на 1.8.5 - скомпилировалось без хидера. Хотя раньше вроде подключать приходилось, но может и ошибаюсь.
Хидер - слово неприличное.) Хедер будет точнее.
Вам правильно советуют. Если не нужен огород и достаточно 2х знаков после запятой:
long l_result = ваше double * 100;
l_result передаёте через union и собираете обратно:
double d_result = l_result;
d_result =/ 100;
Хидер - слово неприличное.) Хедер будет точнее.
Вам правильно советуют. Если не нужен огород и достаточно 2х знаков после запятой:
long l_result = ваше double * 100;
l_result передаёте через union и собираете обратно:
double d_result = l_result;
d_result =/ 100;
Господа, решил проблему:
во-первых выяснилось что мне надо всего два байта передать:
код на стороне Arduino:
double peak = 5020 //число... до 30 000
передача
код на стороне Arduino:
преобразовал в два байта
это вы не "в два байта" преобразовали, а в целое. То есть просто откинули всю дробную часть. И, например. числа 0.1 и 0.001, изначально отличающиеся в 100 раз - после такого "преобразования" станут одинаковыми - равными нулю.
Если вам такое "преобразование" подходит - значит вам изначально никакой float или double был не нужен, не понятно, зачем было себе и другим голову морочить