2017-10-13 59 views
1

我需要能够找到5个连续的EEPROM存储器位,理想情况下最接近2(因为我有位#1 & 2与其他数据相关联,并希望保持组织)。我开发了可以工作的代码,但for循环在找到一组好的数字后继续执行。使循环继续,直到完成目标

Serial.println("got to assignment number finder"); 
for (int AssignCheck = 2; AssignCheck < 250; AssignCheck++){ 
    Serial.println("Finding a good assignment number " + String(AssignCheck)); 
    if (EEPROM.read(AssignCheck) == 255){   //Looks for a blank space which can be used to store the new card 
    if (EEPROM.read(AssignCheck + 1) == 255){ 
     if (EEPROM.read(AssignCheck + 2) == 255){ 
     if (EEPROM.read(AssignCheck + 3) == 255){ 
      if (EEPROM.read(AssignCheck + 4) == 255){ 
      Serial.println("Found assignment numbers " + String(AssignCheck) + " through to " + String(int(AssignCheck) + 4) + ". Scanner value = " + String(Scanner)); 
      int StoreValue = AssignCheck; 
      } 
     } 
     } 
    } 
    } 
} 

我当时以为我可以把while循环它周围,并有while循环停止,一旦一个变量被设置为0而不是1,所以我写了这个:(注意引进while循环,变量和中间的Scanner = 0一行)。

Serial.println("got to assignment number finder"); 
int Scanner = 1; 
while (Scanner == 1){ 
    for (int AssignCheck = 2; AssignCheck < 250; AssignCheck++){ 
    Serial.println("Finding a good assignment number " + String(AssignCheck) + ". Scanner value = " + String(Scanner)); 
    if (EEPROM.read(AssignCheck) == 255){   //Looks for a blank space which can be used to store the new card 
     if (EEPROM.read(AssignCheck + 1) == 255){ 
     if (EEPROM.read(AssignCheck + 2) == 255){ 
      if (EEPROM.read(AssignCheck + 3) == 255){ 
      if (EEPROM.read(AssignCheck + 4) == 255){ 
       Scanner = 0; 
       Serial.println("Found assignment numbers " + String(AssignCheck) + " through to " + String(int(AssignCheck) + 4) + ". Scanner value = " + String(Scanner)); 
       int StoreValue = AssignCheck; 
      } 
      } 
     } 
     } 
    } 
    } 
} 

它正确地识别并设置变量为0时,我想,但while循环似乎并没有产生影响,并继续循环,产生套可能工作的数字。

作为一个新手编码器,我不知道接下来我可以尝试什么。

任何意见将不胜感激。

+0

只是在最后一个if中添加'break'。 – UnholySheep

+0

或者在for循环中添加第二个中断条件的检查,如果你需要其他东西的话 –

+0

如何不写正确的C代码:使用5个嵌套if语句而不是循环。另外,为什么5个非编程的eeprom单元会达到预期的效果?这没有任何意义。 XY问题。 – Lundin

回答

0

在这种情况下,你可以使用指令break

Serial.println("got to assignment number finder"); 
for (int AssignCheck = 2; AssignCheck < 250; AssignCheck++){ 
    Serial.println("Finding a good assignment number " + String(AssignCheck)); 
    if (EEPROM.read(AssignCheck) == 255){   //Looks for a blank space which can be used to store the new card 
    if (EEPROM.read(AssignCheck + 1) == 255){ 
     if (EEPROM.read(AssignCheck + 2) == 255){ 
     if (EEPROM.read(AssignCheck + 3) == 255){ 
      if (EEPROM.read(AssignCheck + 4) == 255){ 
      Serial.println("Found assignment numbers " + String(AssignCheck) + " through to " + String(int(AssignCheck) + 4) + ". Scanner value = " + String(Scanner)); 
      int StoreValue = AssignCheck; 
      break; 
      } 
     } 
     } 
    } 
    } 
} 

正如你可以阅读here,它正是你想要的。

请注意,你的第二个尝试不起作用,因为for loop是while里面:它完成整个for loop之前和之后,比较它的while loop

的“扫描仪”变量你可以纠正它以这样的方式

Serial.println("got to assignment number finder"); 
int Scanner = 1; 
for (int AssignCheck = 2; (AssignCheck < 250) && (Scanner == 1); AssignCheck++){ 
    Serial.println("Finding a good assignment number " + String(AssignCheck) + ". Scanner value = " + String(Scanner)); 
    if (EEPROM.read(AssignCheck) == 255){   //Looks for a blank space which can be used to store the new card 
    if (EEPROM.read(AssignCheck + 1) == 255){ 
     if (EEPROM.read(AssignCheck + 2) == 255){ 
     if (EEPROM.read(AssignCheck + 3) == 255){ 
      if (EEPROM.read(AssignCheck + 4) == 255){ 
      Scanner = 0; 
      Serial.println("Found assignment numbers " + String(AssignCheck) + " through to " + String(int(AssignCheck) + 4) + ". Scanner value = " + String(Scanner)); 
      int StoreValue = AssignCheck; 
      } 
     } 
     } 
    } 
    } 
} 
+0

如果有用,您可以接受答案! :) – Leos313

-1

读EEPROM是昂贵的,请考虑一下:

Serial.println("got to assignment number finder"); 
int Scanner = 1; 
char rollingBuffer[5]; 
rollingBuffer[0] = EEPROM.read(2 + 0); 
rollingBuffer[1] = EEPROM.read(2 + 1); 
rollingBuffer[2] = EEPROM.read(2 + 2); 
rollingBuffer[3] = EEPROM.read(2 + 3); 
rollingBuffer[4] = EEPROM.read(2 + 4); 
pointRoll = 0; 
for (int AssignCheck = 7; (AssignCheck < 255); AssignCheck++) 
{ 
    if ((rollingBuffer[0] == 255) && (rollingBuffer[1] == 255) && (rollingBuffer[2] == 255) && (rollingBuffer[3] == 255) && (rollingBuffer[4] == 255)) 
    { 
     Serial.println("Found assignment numbers " + String(AssignCheck-5) + " through to " + String(int(AssignCheck-1)) + ". Scanner value = " + String(Scanner)); 
     int StoreValue = AssignCheck; 
     break; 
    } 
    rollingBuffer[pointRoll] = EEPROM.read(AssignCheck); 
    pointRoll++; 
    if (pointRoll > 4) pointRoll = 0; 
} 
+0

“读取EEPROM非常昂贵”那么为什么要读取它5次(如果算法不必要)? – Lundin