0

我有一个带有触摸屏的 ILI9341 QVGA 彩色 TFT LCD 显示器的 ESP32 Wrover 模块(整个板是从 HackerBox 购买的,特别是 HackerBox50)。我已经设置了一个具有选项主菜单的程序,其中一个选项打开一个需要密码才能输入的键盘功能。当 Prompted loop() 调用 Canary_Setup() 函数时,该函数将调用触摸屏校准文件和 draw keypad() 函数。键盘工作正常,会将输入的密码发送到串行监视器,但由于某种原因,无论输入的密码如何,它都不会触发 if 语句。char 类型的变量“numberBuffer”是存储密码的地方。当我检查“numberBuffer”的 Len 时,它以正确的长度返回,但在 if 语句中没有正确注册。

变量声明:

char numberBuffer[NUM_LEN + 1] = "";

如果声明:

        if (b == 2) {
      status("Sent value to serial port");
      Serial.print(numberBuffer);
      if (numberBuffer == "2991") {
        Serial.println("hello");
        menu_return();
        break;
      } else {
        Serial.println("wrong");
      }

代码的所有其他方面都可以正常工作,对问题可能是什么有任何想法;我对 Arduino/硬件世界有点陌生,如果我的代码不干净,我很抱歉。

4

1 回答 1

2

这条线没有做你认为它做的事情:

      if (numberBuffer == "2991") {

您不能使用运算符在 C/C++ 中比较字符数组(通常也称为小写字符串,在这种情况下这就是您使用它们的方式)==。您可以使用它比较String对象,但这不是String对象。

当您使用 C/C++ 中的字符数组比较时==,您要比较的是数组的地址,而不是内容。只有当它们是完全相同的数组时才会如此——而不仅仅是完全相同的内容。当一个是字符串文字时不太可能,尤其是当另一个是字符数组时(该变量的值将是一个常量内存地址)。

要比较字符数组,您将使用该strcmp()函数。这需要两个字符指针参数,假设它们指向以 null 结尾的 C 字符串,并比较它们指向的内容。如果它们相同,则返回 0,如果左侧“小于”右侧则返回 -1(“a”小于“b”的方式),如果左侧“大于”则返回 1右侧(“b”大于“a”的方式)。

所以这行代码应该是:

      if (strcmp(numberBuffer, "2991") == 0) {
于 2021-08-14T14:12:00.477 回答