Помогите с проверкой пароля
- Войдите на сайт для отправки комментариев
Ср, 23/03/2016 - 06:22
Собственно хочу сделать установку и проверку пароля. Установка проходит успешно, но после ввода 6 символа дисплей начинает просто бесконечно менять Setup на Enter. Пожалуйста подскажите куда копать, в ардуино пока новичек. Заранее благодарю за ответы.
#include <Keypad.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #define Password_Lenght 7 LiquidCrystal_I2C lcd(0x27,16,2); char Pass[Password_Lenght]; char Data[Password_Lenght]; char Master[Password_Lenght] = "123456"; byte data_count = 0, pass_count = 0, master_count = 0; bool Pass_is_good; char customKey; const byte ROWS = 4; const byte COLS = 4; char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {3, 4, 5, 6}; byte colPins[COLS] = {7, 8, 9, 2}; Keypad customKeypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS); void setup() { lcd.init(); lcd.backlight(); } void loop() { if (Master != Pass) { Install(); if (pass_count == Password_Lenght-1) { Proverka(); } } } //======================================================= void Proverka() { lcd.setCursor(0,0); lcd.print("Enter Password"); customKey = customKeypad.getKey(); if (customKey) { Data[data_count] = customKey; lcd.setCursor(data_count,1); lcd.print(Data[data_count]); data_count++; } if(data_count == Password_Lenght-1) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Password is "); if(!strcmp(Data, Master)) lcd.print("Good"); else lcd.print("Bad"); delay(1000); clearData(); } } //======================================================= void Install() { lcd.setCursor(0,0); lcd.print("Setup Password"); customKey = customKeypad.getKey(); if (customKey) { Pass[pass_count] = customKey; lcd.setCursor(pass_count,1); lcd.print(Pass[pass_count]); pass_count++; if (pass_count == Password_Lenght-1) { strcpy(Master,Pass); clearData(); } } } //======================================================= void clearData() { while(data_count !=0) { Data[data_count--] = 0; } return; }
Строка 36 - Вам про сравнение массивов поискать-почитать нужно.
Например : http://roboforum.ru/forum2/topic5332.html
И ещё зачем с cleardata() голый return?
В 104 строке может быть засада когда где-то data_count уже после проверки станет нулём (на прерывании или в параллельном процессе, например, а то и что-то его затрёт нечаяно) - бывает и так. Он же завернётся в 0xFF и пошурует далеко за пределами массива нули писать. Надо объявлять его знаковым и проверять на больше нуля, ибо есть вероятность проскочить ноль. Индексы и счётчики всегда лучше делать знаковые чтобы отрицательным значением указывать выход за пределы. Для процессора работа со знаковым и беззнаковым числами совершенно одинакова, только инструкции различаюися в названии. :)
Строка 36 - Вам про сравнение массивов поискать-почитать нужно.
Например : http://roboforum.ru/forum2/topic5332.html
Огромное спасибо, программа собиралась на поверхностных знаниях и готовых кусках кода. Ваш совет очень помог.
strcmp помог исправить ситуацию
faeton, спасибо учту.