2017-10-13 5 views
1

Je dois être capable de trouver 5 bits séquentiels de la mémoire EEPROM, idéalement le plus proche de 2 (comme j'ai le bit # 1 & 2 associé à d'autres données et que les choses restent organisées). J'ai développé ce code qui fonctionne, mais la boucle for continue après avoir trouvé un bon ensemble de nombres.Faire la boucle continuer jusqu'à ce qu'un objectif soit atteint

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; 
      } 
     } 
     } 
    } 
    } 
} 

J'ai alors pensé que je pourrais mettre une boucle while autour d'elle, et ont la butée de boucle while une fois variable est à 0 par opposition à 1, donc j'écrit ceci: (remarquez l'introduction du while loop, la variable et la ligne Scanner = 0 au milieu).

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; 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Il identifie correctement et définit la variable à 0 quand je veux, mais la boucle while ne semble pas avoir un impact et la boucle continue à produire des séries de chiffres qui pourraient travailler.

En tant que codeur débutant moi-même, je ne suis pas sûr de ce que je pourrais essayer ensuite.

Un conseil serait grandement apprécié.

+0

juste ajouter un 'break;' dans le dernier 'if'? – UnholySheep

+0

Ou ajoutez une vérification pour la condition de la deuxième pause dans la condition dans la boucle 'for', si vous avez besoin de temps pour autre chose –

+0

Comment ne pas écrire le bon code C: utilisez 5 instructions imbriquées if au lieu d'une boucle. Aussi, pourquoi 5 cellules eeprom non programmées sont-elles le résultat souhaité? Cela n'a aucun sens. Problème XY – Lundin

Répondre

0

Dans ce cas, vous pouvez utiliser l'instruction 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; 
      } 
     } 
     } 
    } 
    } 
} 

Comme vous pouvez le lire here, il fait exactement ce que vous voulez.

S'il vous plaît noter que votre deuxième tentative ne fonctionne pas parce que le for loop est à l'intérieur du tout: il se termine avant toute for loop et, après, il compare la variable « scanner » du while loop

vous pouvez corriger de cette façon:

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

Vous pouvez accepter la réponse si c'était utile! :) – Leos313

-1

EEPROM la lecture est cher, s'il vous plaît considérez ceci:

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

"Lire l'EEPROM est cher" Alors pourquoi la lire 5 fois si ce n'est pas nécessaire pour l'algorithme? – Lundin