标题含糊不清,但我无法真正想到如何简洁地描述这个问题。这是我的代码:
#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
正如您在上一个读/写行中所看到的,它有时可以正常工作。在我的代码中你能看到什么东西可以给出这些奇怪的值吗?我已经搞砸了几个小时了,并没有想出这种奇怪行为的理由。
编辑:
对于任何尝试远程关闭的人,这可能会有所帮助。不幸的是,这是非常具体的案例,但我认为一般的解决方案可以被真正对答案感兴趣的人抽象出来。
最终,我决定将“思考”放在计算机方面。如果你没有收集我的评论或帖子,这段代码就会出现在DigiSpark Arduino上 - 通过USB端口插入计算机的“模拟”。它读取计算机和从计算机读取。而不是让DigiSpark解析零并记住最后一个,我让计算机这样做。
支持这一点的最大原因是DigiSpark的可怕/不存在的调试功能。
答案 0 :(得分:3)
如果您在第一个循环中只读取一个值,则usbReadings
的第二个值将保持未定义但仍会复制到defaultReadings