我有三个完全相同的电路板的容纳ATmega2560单片机。我使用Atmel Studio 7进行引信和闪烁HEX。我使用Visual和混合使用C和Arduino编码。
我有一个结构数组定义。我从一个由MCU的串口提供的json中将数据填充到这个结构数组中。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 2560。
(注意: 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我希望我能向你解释清楚到底出了什么问题?
从现在开始我很感谢你的投入。
发布于 2018-01-18 15:05:20
最后,在将代码(大约2000行)缩小到一定程度之后,我可以解决它。同样感谢安迪帮助我继续在这个问题上到处寻找。
在Else中的Loop中,RefreshScreen();再次从EEPROM重新加载recordsOut,这是覆盖struct数组recordsOut和下一轮JSON --数据在那里继续存在。
我已经从RefreshScreen();中删除了EEPROM的读取功能,它已经开始工作了。
https://stackoverflow.com/questions/48284856
复制相似问题