Цикл в цикле. Выход из внутреннего во внешний.
- Войдите на сайт для отправки комментариев
Пт, 04/05/2018 - 11:03
Доброго дня.
Встала задача организовать проверку валидности меток. Имеем двухуровневый(если так правильно называется) массив меток. Необходимо сравнивать побайтно каждую метку. Был реализован код из двух циклов 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; } }
https://msdn.microsoft.com/en-us/library/37zc9d2w.aspx
break - выход из текущего цикла.
спасибо! попробую.