0

标题含糊不清,但我实在想不出如何简明扼要地描述这个问题。这是我的代码:

#include <DigiUSB.h>

// Global
#define NUM_LEDS 2
int defaultReadings[] = {2,2};

void read_usb()
{
    int usbReadings[NUM_LEDS], i, numChars = 0;
    for (i=0;DigiUSB.available();i++)
    {
        usbReadings[i] = DigiUSB.read()-'0';
        numChars++;
    }

    for (i=0;i<numChars;i++)
    {
        if (usbReadings[i] == 0)
            // usbReadings is local, defaultReadings is global
            usbReadings[i] = defaultReadings[i];
        DigiUSB.write(usbReadings[i]+'0');
    }

    memcpy(defaultReadings,usbReadings,sizeof(defaultReadings));
}

所以 defaultReadings 变量被初始化为 {2,2}。当 available() 时,新字符被读入本地数组 usbReadings。

接下来,当迭代 usbReadings 时,如果 usbReadings 值为零,则该函数应恢复到该位置的旧条目。usbReadings 的大小始终与 defaultReadings 的大小相同。

然而,这在实践中是行不通的。代码运行良好并且没有产生错误,但它没有做我认为应该做的事情。

这是一个通过四个函数调用 read_usb() 来读取和写入内容的示例。

  Actual            Intended

Reads:  3,2       Reads:  3,2
Writes: 3,2       Writes: 3,2
Reads:  3,0       Reads:  3,0
Writes: 3,3       Writes: 3,2
Reads:  0,4       Reads:  0,4
Writes: 2,4       Writes: 3,4
Reads:  0,3       Reads:  0,3
Writes: 2,3       Writes: 3,3

正如您在最后一个读/写行中看到的那样,它有时确实可以正常工作。你能在我的代码中看到什么会给出这些奇怪的值吗?我已经搞砸了几个小时,还没有想出奇怪行为的原因。

编辑:

我的解决方案

对于任何尝试远程关闭的人来说,这可能会有所帮助。不幸的是,这是非常具体的案例,但我认为任何真正对答案感兴趣的人都可以抽象出通用解决方案。

最终,我决定把“思考”放在电脑端。如果您没有从我的评论或我的帖子中收集信息,那么此代码将在通过 USB 端口插入计算机的 DigiSpark Arduino 上运行。它从计算机读取数据。我没有让 DigiSpark 解析零并记住最后一个,而是让计算机这样做。

支持这一点的最大原因是 DigiSpark 糟糕/不存在的调试功能。

4

1 回答 1

3

如果您在第一个循环中只读取一个值,则第二个值usbReadings将保持未定义,但仍会复制到defaultReadings

于 2013-07-15T15:48:20.980 回答