标题含糊不清,但我实在想不出如何简明扼要地描述这个问题。这是我的代码:
#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 糟糕/不存在的调试功能。