Данные массива структур в первом индексе сбрасываются для некоторых ATmega 2560

У меня есть 3 точно такие же платы, вмещающие ATmega2560 MCU.
Я использую Atmel Studio 7 для предохранителей и прошивки HEX.
Я использую Visual Studio с плагином Visual Micro, использующим смесь C и Arduino.

У меня есть определение массива структуры. Я заполняю данные в этот массив массива из json, который подается через последовательный порт MCU. Парсером Json является ArduinoJson.

Определения:

#define MAX_RECORDS 20 //Max number of records in the struct

typedef struct Record {
uint8_t id;//unique number to define data sequence
uint8_t sec;
uint8_t obj;
uint16_t xs;
uint16_t ys;
uint16_t xe;
uint16_t ye;
uint8_t clr;
uint8_t tsz;
uint8_t tid;
} tRecord;

struct Record recordsOut[MAX_RECORDS];

Основной цикл:

void loop() {
if (IsNetworkAlertState == 0) {
if (setupProg[0].gid == 255 || setupProg[0].bnr == 255 || recordsOut[0].id == 255) {
if (IsNoSetupAlertState == 0) {
IsNoSetupAlertState = 1;
}
}
else {
if (IsNoSetupAlertState == 1) {
IsNoSetupAlertState = 0; // Nothing to alert
RefreshScreen(); //Redraw data on screen after the setup is done!
}
}
}
}

Пример данных, полученных из серийного номера:

const char* json = "{\"id\":1,\"sec\":1,\"obj\":1,\"xs\":1,\"ys\":0,\"xe\":158,\"ye\":62,\"clr\":0,\"tsz\":0,\"tid\":-1}";

Абонент:

Это называется, может быть, 20 раз, чтобы хранить все данные.
Наконец, оно записывается в энергонезависимую память.

ApplyDesignSettings(json);

Функция для хранения входящих данных:

void ApplyDesignSettings(char buffer[]) {

const size_t bufferSize = JSON_OBJECT_SIZE(10) + 70;
DynamicJsonBuffer jsonBuffer(bufferSize);

if (IsDebugOn == 1) {
Serial.print("buffer:");
Serial.println(buffer);
}

JsonObject& root = jsonBuffer.parseObject(const_cast<char*>(buffer));
if (!root.success()) {
Serial.println("parseObject() failed#1");
return;
}

uint8_t id = root["id"];
uint8_t sec = root["sec"];
uint8_t obj = root["obj"];
uint16_t xs = root["xs"];
uint16_t ys = root["ys"];
uint16_t xe = root["xe"];
uint16_t ye = root["ye"];
uint8_t clr = root["clr"];
uint8_t tsz = root["tsz"];
uint8_t tid = root["tid"];

int ref = id;
int idx = ref - 1;
recordsOut[idx].id = id;
recordsOut[idx].sec = sec;
recordsOut[idx].obj = obj;
recordsOut[idx].xs = xs;
recordsOut[idx].ys = ys;
recordsOut[idx].xe = xe;
recordsOut[idx].ye = ye;
recordsOut[idx].clr = clr;
recordsOut[idx].tsz = tsz;
recordsOut[idx].tid = tid;
}

Все идет нормально. Я доволен этим до сих пор.
А вот такаяно«;

Иногда, после перепрошивки некоторого ATmega2560 и отправки данных, упомянутых выше, он пропускает / перезаписывает / удаляет первый индекс структура массив, и я нашел его пустым (255)
хотя остальные записи в порядке.

Это результат:

С отладкой цикла я получаю это ниже. Это происходит только для некоторых ATmega2560.

(Обратите внимание: после ID: 8 (индекс 7) все пустые, что ожидается в данном примере)

========================================
Design data in non-volatile memory:
========================================
id:255, sec:255, obj:255
id:2, sec:1, obj:2
id:3, sec:1, obj:3
id:4, sec:1, obj:3
id:5, sec:2, obj:1
id:6, sec:2, obj:2
id:7, sec:2, obj:3
id:8, sec:2, obj:3
id:255, sec:255, obj:255
id:255, sec:255, obj:255
id:255, sec:255, obj:255
id:255, sec:255, obj:255
id:255, sec:255, obj:255
id:255, sec:255, obj:255
id:255, sec:255, obj:255
id:255, sec:255, obj:255
id:255, sec:255, obj:255
id:255, sec:255, obj:255
id:255, sec:255, obj:255
id:255, sec:255, obj:255
========================================

Обычно первый индекс должен выглядеть следующим образом;

id:1, sec:1, obj:1

Я надеюсь, что смогу объяснить достаточно, чтобы дать вам понять, что идет не так?

Я ценю ваш вклад с этого момента.

1

Решение

Наконец, после сужения кода (почти 2000 строк) до определенного момента, я смог решить его. Также благодаря @ Энди помог мне продолжить поиск кое-где по этому вопросу.

Внутри Else в Loop, RefreshScreen(); перезагружал записи EEPROM снова, и это переписывало массив структуры recordsOut и в следующих раундах JSON данные продолжали формироваться там.

Я удалил функции чтения EEPROM из RefreshScreen(); и это начало работать.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector