下面的程序使用键盘和arduino来测试输入是否等于密码。每当按下“#”时,检查输入,然后存储输入的变量重置为空字符串(char输入[257] =“”)。然后程序循环回到void loop()代码块的开头。当我的程序循环回到“void loop()”代码块的开头时,我遇到了问题。当我将输入重置为空字符串时,输入将重置为空字符串。但是,当程序循环时,输入的值将更改为之前的值。因此,如果我最初输入“123abc”并点击“#”程序会告诉我输入不正确然后程序会将变量重置为空字符串,但是当程序循环时,存储空字符串的变量会被更改回来到“123abc”。发生了什么?为什么变量不是空字符串?
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {9, 8, 7, 6}; //connect to the column pinouts of the keypad
char password[9] = "3994A", input[257]="";
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int x;
void setup(){
Serial.begin(9600);
}
void loop(){
x = 0;
Serial.println(input);
while (1)
{
char key = keypad.getKey();
if (key)
{
if (key == '#')
{
break;
}
input[x] = key;
x+=1;
}
}
if (strcmp(password,input) == 0)
{Serial.println("Access Granted");
}
else
{Serial.println("Access Denied");
}
char input[257] = "";
Serial.println(input);
}
答案 0 :(得分:0)
不一样的变量。您的顶部区域中有一个input
,而loop
函数中有一个{{1}}。
答案 1 :(得分:0)
这一行
char input[257] = "";
创建一个名为input的新局部变量,但你不想这样做。你已经在这里做了一个全球性的:
char password[9] = "3994A", input[257]="";
更改
char input[257] = "";
到
memset(input,0,257);
所以你不要丢弃堆栈中的新变量,而是使用之前声明的全局变量。
答案 2 :(得分:0)
第二个char input[257] = "";
声明一个名为input
的新变量。它不会更改名为input
的现有变量的内容。请改用memset()
。
答案 3 :(得分:0)
我同意再次声明输入变量
时的错误char input[257] = "";
但我不会用memset()解决它,而是做
input[0]='\0';
因为它更快,并且不需要在代码中包含memset()函数。我们谈论的是微控制器,CPU和内存是宝贵的,编写快速和轻量代码是一个好习惯。
答案 4 :(得分:0)
在这里,我怎么能实现这个目标:
转到官方Arduino网站下载 Keypad.h http://playground.arduino.cc/Code/Keypad#Download(ctrl + f并输入:download)下载库以打开 C:\ Program Files(x86) )\ Arduino \ libraries 关闭当前的Arduino屏幕,然后重新打开屏幕。重写代码并将代码放在第一位。我用这种方法。
#include <Keypad.h>