如何使键盘输入无效?

时间:2017-02-28 02:56:05

标签: c++ arduino

我需要使用4x3键盘来使用伺服库移动bldc电机。我设法将键盘输入放在一个字符串中,但我不能null终止它。代码的概念是,我输入0-180之间的伺服值,以便从键盘移动伺服。然后输入值被中继到bldc。不知怎的,我怎么终止字符串?

#include "Keypad.h"
#include <LiquidCrystal.h>
#include <Servo.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(A0,A1,A2,A3,A4,A5);
Servo myservo;

const byte ROWS = 4; //four rows
const byte COLS = 3; //four columns
char keys[ROWS][COLS] =
 {{'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
  };
byte rowPins[ROWS] = {9,8,7,6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5,4,3}; //connect to the column pinouts of the keypad
int count=0;

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup()
{
  Serial.begin(9600);
    Serial.print("enter:");
    myservo.attach(11);
}


void loop()

{
  char key = keypad.getKey();
  char value[4];
    int i=0;
    if  (key >= '0' && key <= '9')
  {
     value[i]=key;
     i++;
     value[i]= 0 ;
     if ( i = 3)
     {
      value[i] = true;
     }
  }

  if ( key = '#')
   {
    value[i]= true;
    Serial.print(value);
   }

  if (value[i] = true)
  {
    int pos = value[4].toInt;
    myservo.write( value);
  }


}

2 个答案:

答案 0 :(得分:1)

您通常不需要终止字符串。如果你知道长度,那通常就足够了。所以keys是一个4x3数组,你不需要终止这4个字符串中的任何一个。

您在value[4]中存储了一个字符。然后,您始终在value[1]进行null终止。

您真正的问题是=是作业,==是比较。

答案 1 :(得分:1)

在您的源代码中,您首先使用char[] 空终止您的value[i] = 0数组,但是当按下#时,您会用{{覆盖该位置1}}在打印之前,显然会导致问题。

这是快速而肮脏的修复:

value[i]= true;

请注意,在此源代码示例... void loop() { static char buffer[4]; static byte i = 0; char key = keypad.getKey(); // i < 3: prevent buffer overflow if ('0' <= key && key <= '9' && i < 3) { buffer[i] = key; ++i; } else if (key == '#' && i > 0) { buffer[i] = '\0'; // null-terminate buffer Serial.println(buffer); // debug print ? int value = atoi(buffer); myservo.write(value); i = 0; } } 必需来终止一系列数字,并且在第三个数字之后的序列中的每个数字都被忽略。这并不能完全重新组合您的原始行为,但我认为首选一致性