Разделение на ДВА байта для сохранения в EEPROM
Я пытаюсь сохранить в памяти (в данном случае в памяти FRAM) ДВОЙНОЕ значение, я пробую тот же метод с использованием ОБЪЕДИНЕНИЯ для сохранения значения с плавающей запятой, но не переходите ко 2-му числу после точки, почему? Где я ошибаюсь? спасибо за помощь.
//---------------------------------------------------------
union Scomp_double // si utilizza союз х двойной
{
double temp;
char byte_s[8];
} S_double;
//---------------------------------------------------------
double mioDouble = 1234567.12345678;
//------------------------- ДВОЙНОЙ--------------------------------
Serial.println("DOUBLE");
byte d0 = 0; // contengono i байт del float
byte d1 = 0;
byte d2 = 0;
byte d3 = 0;
byte d4 = 0;
byte d5 = 0;
byte d6 = 0;
byte d7 = 0;
S_double.temp = mioDouble;
d0 = S_double.byte_s[0];
d1 = S_double.byte_s[1];
d2 = S_double.byte_s[2];
d3 = S_double.byte_s[3];
d4 = S_double.byte_s[4];
d5 = S_double.byte_s[5];
d6 = S_double.byte_s[6];
d7 = S_double.byte_s[7];
Serial.println(d0);
Serial.println(d1);
Serial.println(d2);
Serial.println(d3);
Serial.println(d4);
Serial.println(d5);
Serial.println(d6);
Serial.println(d7);
fram.writeEnable(true);
fram.write8(11, d0);
fram.writeEnable(false);
fram.writeEnable(true);
fram.write8(12, d1);
fram.writeEnable(false);
fram.writeEnable(true);
fram.write8(13, d2);
fram.writeEnable(false);
fram.writeEnable(true);
fram.write8(14, d3);
fram.writeEnable(false);
fram.writeEnable(true);
fram.write8(15, d4);
fram.writeEnable(false);
fram.writeEnable(true);
fram.write8(16, d5);
fram.writeEnable(false);
fram.writeEnable(true);
fram.write8(17, d6);
fram.writeEnable(false);
fram.writeEnable(true);
fram.write8(18, d7);
fram.writeEnable(false);
S_double.byte_s[0] = fram.read8(11); // si ricompone ил двойной
S_double.byte_s[1] = fram.read8(12);
S_double.byte_s[2] = fram.read8(13);
S_double.byte_s[3] = fram.read8(14);
S_double.byte_s[4] = fram.read8(15);
S_double.byte_s[5] = fram.read8(16);
S_double.byte_s[6] = fram.read8(17);
S_double.byte_s[7] = fram.read8(18);
double masterDouble = S_double.temp;
Serial.println(masterDouble);
//------------------------- ДВОЙНОЙ-------------------------------
ожидаемый результат 1234567.12345678 , полученный результат 1234567,12
@Francesco Valla, 👍0
Обсуждение2 ответа
как подсказать в комментариях, так и на сайте Arduino reference DOUBLE
только на arduino 2 float это 8 байт.
Если вы имеете в виду на Due, да, но читатели, которые не говорят по-итальянски, не будут автоматически сопоставлять фактическое название продукта "Arduino Due" с "Arduino 2" и понимать, что вы говорите о плате на базе ARM, а не о традиционной плате на основе AVR, где float
и double
- это 4-байтовые типы., @Chris Stratton
Проблема здесь заключается в последовательном выводе, который по умолчанию выводит только 2 знака после запятой. Решение: Serial.println(masterDouble,8);
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Как читать и записывать EEPROM в ESP8266
- Какой реальный срок службы EEPROM?
- Как запомнить значения переменных после перезагрузки платы Arduino Uno R3
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- Очистка EEPROM
- Как сохранить переменную с плавающей запятой в EEPROM
- Spiffs против Eeprom на esp8266
[
двойной
](https://www.arduino.cc/en/Reference/Double ) на Arduino составляет 4 байта. То же самое, что ипоплавок
., @gre_gorнет возможности иметь 4 цифры после точки, приятно :) спасибо за ответ, @Francesco Valla
Почему бы просто не использовать "fram.write(&aFloatVar, sizeof(aFloatVar));"??, @Mikael Patel
а зачем читать? ТНК, @Francesco Valla