Разделение на ДВА байта для сохранения в 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

, 👍0

Обсуждение

[двойной](https://www.arduino.cc/en/Reference/Double ) на Arduino составляет 4 байта. То же самое, что и поплавок., @gre_gor

нет возможности иметь 4 цифры после точки, приятно :) спасибо за ответ, @Francesco Valla

Почему бы просто не использовать "fram.write(&aFloatVar, sizeof(aFloatVar));"??, @Mikael Patel

а зачем читать? ТНК, @Francesco Valla


2 ответа


1

как подсказать в комментариях, так и на сайте Arduino reference DOUBLE

только на arduino 2 float это 8 байт.

,

Если вы имеете в виду на Due, да, но читатели, которые не говорят по-итальянски, не будут автоматически сопоставлять фактическое название продукта "Arduino Due" с "Arduino 2" и понимать, что вы говорите о плате на базе ARM, а не о традиционной плате на основе AVR, где float и double - это 4-байтовые типы., @Chris Stratton


1

Проблема здесь заключается в последовательном выводе, который по умолчанию выводит только 2 знака после запятой. Решение: Serial.println(masterDouble,8);

,