首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对某些ATmega 2560的第一个索引中的结构数组数据进行重置。

对某些ATmega 2560的第一个索引中的结构数组数据进行重置。
EN

Stack Overflow用户
提问于 2018-01-16 15:37:56
回答 1查看 97关注 0票数 1

我有三个完全相同的电路板的容纳ATmega2560单片机。我使用Atmel Studio 7进行引信和闪烁HEX。我使用Visual和混合使用C和Arduino编码。

我有一个结构数组定义。我从一个由MCU的串口提供的json中将数据填充到这个结构数组中。Json解析器是ArduinoJson。

定义

代码语言:javascript
复制
#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];

主回路:

代码语言:javascript
复制
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!
            }
        }
    }
}

从串行接收到的示例数据:

代码语言:javascript
复制
const char* json = "{\"id\":1,\"sec\":1,\"obj\":1,\"xs\":1,\"ys\":0,\"xe\":158,\"ye\":62,\"clr\":0,\"tsz\":0,\"tid\":-1}";

来电者:

为了存储所有数据,这可能会被调用20次。最后,它被写入非易失性存储器.

代码语言:javascript
复制
ApplyDesignSettings(json);

用于存储传入数据的函数:

代码语言:javascript
复制
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)都是空的,这在这个给定的示例中是预期的)

代码语言:javascript
复制
========================================
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
========================================

通常情况下,第一个索引应该是这样的;

代码语言:javascript
复制
id:1, sec:1, obj:1

我希望我能向你解释清楚到底出了什么问题?

从现在开始我很感谢你的投入。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-18 15:05:20

最后,在将代码(大约2000行)缩小到一定程度之后,我可以解决它。同样感谢安迪帮助我继续在这个问题上到处寻找。

Else中的Loop中,RefreshScreen();再次从EEPROM重新加载recordsOut,这是覆盖struct数组recordsOut和下一轮JSON --数据在那里继续存在。

我已经从RefreshScreen();中删除了EEPROM的读取功能,它已经开始工作了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48284856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档