首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将另一个数字之后的数字转换为2个算法的数字?(1则1= 11) - Arduino

将另一个数字之后的数字转换为2个算法的数字?(1则1= 11) - Arduino
EN

Stack Overflow用户
提问于 2013-02-24 04:12:06
回答 1查看 185关注 0票数 0

所以,我正试着用Arduino来设置一个计算器。我已经成功地从红外遥控器读取数据,并将其显示在LCD 16x2显示屏上。例如,如果我输入"1",显示屏上将显示"1“,但我如何让程序理解,如果在按Enter按钮之前按下了两个或更多数字,则该数字具有多个算法?比如按1,然后按2,然后按3等于123?

我可以使用很多if语句来做一些类似的事情,比如“如果在一个现有的1Than变量== 11之后按下了1”,等等,但是这是没有用的。

不管怎样,我该怎么做呢?或者你可以告诉我这种函数/算法的名称,这样我就可以期待它的出现了。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-24 05:54:03

这里有两种方法来解决这个问题。finished将简单地连接一个字符串类型,并在通过回车符完成时将其转换为整数。

代码语言:javascript
复制
#define _CR 13
String readString;

void setup() {
  Serial.begin(9600);
}

void loop() {
  while (Serial.available()) {
    char c = Serial.read();  //gets one byte from serial buffer
    readString += c; //makes the string readString
    delay(2);  //slow looping to allow buffer to fill with next character
  }

  if ((readString.length() >0) || ( c == CR_)) {
    Serial.println(readString);  //so you can see the captured string 
    int n = readString.toInt();  //convert readString into a number

    // do whatever you want
    // ...
    //
    //

    readString=""; //empty for next input
  } 
}

另一种方法是使用字符间超时。请注意,通常

代码语言:javascript
复制
while (!Serial.available()) {
  // wait for Serial input
};
inkey = Serial.read();

就是阻塞。下面使用字符数组的指针来构建输入,最多为int16_t长度的5位数(即65535)。嗯,它只处理积极的方面。但您可以调整它以获得负片,以及其他命令,如"+“、"-”等。

我之所以使用ICT方法,是因为Arduino的IDE串行监视器实用程序缺省为No LF/CR。它只是在没有任何LF/CR的情况下立即发送输入。

代码语言:javascript
复制
int16_t last_ms_char; // milliseconds of last recieved character from Serial port.
int8_t buffer_pos; // next position to recieve character from Serial port.
char buffer[6]; // 0-35K+null
int16_t fn_index;
int16_t Serial_Input_Number;

void setup() {

  Serial.begin(115200);
  last_ms_char = millis(); // stroke the inter character timeout.
  buffer_pos = 0; // start the command string at zero length.

}

void loop() {

  char inByte;
  if (Serial.available() > 0) {
    inByte = Serial.read();
    if (isDigit(inByte)) { // macro for ((inByte >= '0') && (inByte <= '9'))
      // else if it is a number, add it to the string
      buffer[buffer_pos++] = inByte;
    } else {
      // input char is a letter command
      buffer_pos = 0;
      parse_menu(inByte);
    }
    buffer[buffer_pos] = 0; // update end of line
    last_ms_char = millis(); // stroke the inter character timeout.

  } else if ((millis() - last_ms_char) > 500 && ( buffer_pos > 0 )) {
    // ICT expired and have something
    if (buffer_pos == 1) {
      // look for single byte (non-number) menu commands
      parse_menu(buffer[buffer_pos - 1]);

    } else if (buffer_pos > 5) {
      // dump if entered command is greater then uint16_t
      Serial.println(F("Ignored, Number is Too Big!"));

    } else {
      // otherwise its a number, scan through files looking for matching index.
      Serial_Input_Number = atoi(buffer);

      //
      //
      // Do something with "Serial_Input_Number"
      // one time here. Or set flag and do something out of this big if
      // ...
      //
      //


    }

    //reset buffer to start over
    buffer_pos = 0;
    buffer[buffer_pos] = 0; // delimit

    //
    //
    // do other stuff repeatedly between new characters
    // ...
    //
    //
  }

不能保证准确的代码,因为它是从更大的例子中截取和修剪的,确实可以工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15045106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档