我正在和Arduino一起造一个红外线遥控器。红外发射器的每个命令都存储为基于RC-5标准的逻辑信号的微秒延迟数组。
例如:
// Command #1866: Command:$1865
// Protocol: RC5, Parameters: D=30U F=10U
const uint16_t repeat_Command__1865[] PROGMEM = { 889U, 889U, 1778U, 1778U, 889U, 889U, 889U, 889U, 889U, 889U, 1778U, 889U, 889U, 889U, 889U, 1778U, 1778U, 1778U, 1778U, 65535U };因为我想首先检查哪些命令在我想要控制的设备上有效,所以我想检查RC5标准中的每一个可用命令。它的5位地址和6位命令导致了大约2000个我需要检查的命令。我用一个名为IRScrutinizer的程序员生成这些命令,当我给它设备地址(1-15)和命令(1-63)时,它会输出微秒级的延迟。它生成上面的代码。我有一种方法可以通过脚本生成所有的2000个命令。所以我有2000个数组,命名为:repeat_Command_{命令数}
正如我现在所读到的,在c++中,没有一种简单的方法可以通过定义变量名称的变量来访问变量。
因此,我需要在for循环中的所有命令之间切换case,如下所示:
void loop() {
Serial.println(F("Looping trough all Numbers"));
for (int i = 0; i<1983;i++)
{
delay(1000)
}
switch (i) {
case 1L:
sendRaw(repeat_Command_, 24U, 36U);
break;
case 2L:
sendRaw(repeat_Command__1, 22U, 36U);
break;
case 3L:
sendRaw(repeat_Command__2, 24U, 36U);
break;
.
.
.但这会占用大量内存供Arduino处理。因为我使用的是Progmem,所以问题只是switch case参数。
我的想法是将命令存储在多维数组中,然后访问forloop中的每个“行”。
但是我该怎么做呢?
当我尝试的时候:
const uint16_t commands[1][] PROGMEM = {1,2,3,4};
const uint16_t commands[2][] PROGMEM = {5,6,7,8};这不起作用,我也不希望它起作用,但我不知道我的数组方法是否足够好做到这一点。
我得到一个错误:
declaration of 'commands' as multidimensional array must have bounds for all dimensions except the first问题是每个命令的长度不是固定的。
另一种方法是在for循环中生成微秒数组。但这是一个完全不同的逻辑问题,我宁愿不去解决:D
发布于 2021-10-31 18:21:18
看起来你被多维数组的语法弄糊涂了--你不能在多个地方声明相同的东西,然后期望它们被组合在一起。
您的简单测试用例必须这样编写:
const uint16_t commands[][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8}};但只有当所有命令的长度都相同时,这才能起作用。(这是上面第二维中的4。) 2D数组存储在内存中紧跟前一行之后的每一行,因此每一行必须具有相同的大小。
一种解决方案是将每个命令存储在它自己的数组中,然后您可以使用另外两个数组(或结构数组)来存储命令的长度以及指向它们的指针。
https://stackoverflow.com/questions/69789187
复制相似问题