Цикл в цикле. Выход из внутреннего во внешний.

croan
Offline
Зарегистрирован: 21.02.2018

Доброго дня.

Встала задача организовать  проверку валидности меток. Имеем двухуровневый(если так правильно называется) массив меток. Необходимо сравнивать побайтно каждую метку. Был реализован код из двух циклов for . Проблема в том что при запуске внутреннего цикла и не совпадении метки внутренний цикл не останавливается и не переходит на внешний уровень. Не могу понять как такое реализовать. Подскажите пожалуйста. На форуме не нашел инфы.

#include <SoftwareSerial.h>
 
// Подключаем сам ридер
SoftwareSerial RfidReader(8, 9);
 
int data1 = 0;
bool ok = false;
bool reads = false;
// активируемый порт при считывании валидной карты
int yes = 6;
// активируемый порт при считывании карты не из списка
int no = 7;
 
// Массив с номерами карт. Для увеличения валидных карт просто добавьте еще один массив внутрь
const PROGMEM  char  tags[][14] = {
{2, 50, 49, 48, 48, 52, 66, 68, 53, 70, 56, 52, 55, 2 },
{2, 50, 49, 48, 48, 52, 66, 68, 53, 70, 56, 52, 55, 3 }

};
int newtag[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 
int tags1[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
void setup(){
 RfidReader.begin(9600);
 Serial.begin(9600); 
 pinMode(yes, OUTPUT); 
 pinMode(no, OUTPUT);
}


// данная функция сравнивает по очереди все 14 символов
// массива из базового массива, и только что считанного массива
uint8_t compare(int str1[], int str2[]) 
{ 
    for(int i = 1; i < 14; i++) 
    { 
        if(str1[i] != str2[i]) return 0; 
    } 
    return 1; 
} 
 
void loop(){
 reads = ok = false;
 int tag;
 // если карта поднесена
 if (RfidReader.available() > 0) {
  delay(100);
  // создаем массив с данными поднесенной карты
  for (int x = 0 ; x < 14 ; x++){
   data1 = RfidReader.read();
   newtag[x] = data1;
   //вывод в монитор порта организовал для проверки того что считали  
   Serial.println(newtag[x]);    
  }
 
   //пока еще какая-то карта доступна 
  while (RfidReader.available()) 
    // все непустые байты считываем вникуда (всё что надо, считали выше)))) 
    while (RfidReader.read() > 0) {};
  reads = true;
  // по очереди сравниваем данные карты с валидным массивом
//вот тут и возникает проблема. Не переходит на верхний уровень при достижении i предельного значения.
for(int k = 0; k < 3 ; k++){  
  for(int i = 0; i < sizeof(tags) ; i++){
 tag = pgm_read_byte(&(tags[k][i]));
tags1[i] = tag;

//здесь вывод в монитор порта того что взяли из PROGMEM 
Serial.println(tags1[i]);
 
   if (compare(newtag, tags1) == true){
    ok = true;
    break;
   } 
  }
}
  
 }
 // если произошло считывание
 if(reads){
  // если карта есть в списке валидных
  if (ok){
   digitalWrite(yes, HIGH);
   delay(2000);
   digitalWrite(yes, LOW);
  }
  // если карт нету в списке валидных
  else {
   digitalWrite(no, HIGH);
   delay(2000);
   digitalWrite(no, LOW);
  }
  ok = false;
 }
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

break - выход из текущего цикла.

croan
Offline
Зарегистрирован: 21.02.2018

спасибо! попробую.