首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从串行监视器读取和存储整数

从串行监视器读取和存储整数
EN

Code Review用户
提问于 2020-04-08 23:17:05
回答 1查看 674关注 0票数 2

描述

我想了解如何在不使用Serial.parseInt()的情况下在变量中写入和存储整数。我找不到关于这方面的任何代码示例。也许这是正确的方法,虽然它不检测和大写字母和特殊字符。请留下一些关于改进方法的反馈意见。谢谢!)

代码语言:javascript
复制
void setup()
{
  Serial.begin(9600); // Opens serial port, sets data rate to 9600 bps
  Serial.println(F("Serial port opened!"));
}

void loop()
{
  byte received;
  static byte counter = 0;
  static uint32_t number = 0; // Store value from 0 to 4294967295

  while (Serial.available()) // Read data in serial receive buffer
  {
    received = Serial.read(); // Store received byte
    if (received != 10) // Terminate if newline char detected
    {
      if (counter != 0) // Put number in its correct position (base-10 system)
      {
        number *= 10;
        number += (received - '0');
      }
      else
      {
        number = (received - '0');
      }
      counter++;
    }
    else
    {
      Serial.println(number); // Print value inside number and reset
      counter = 0;
    }
  }
}
EN

回答 1

Code Review用户

发布于 2020-04-11 21:25:52

要获得更健壮的代码来检测非数字输入、溢出和启动阶段,请考虑使用状态机

代码语言:javascript
复制
typedef struct {
  int counter;  // <0:indeterminate, 0:spacing, >0:digits; 
  uint32_t number;
} loop_state;

// Quietly drop data in 3 cases:
// 1) Overflow
// 2) Non-numeric
// 3) When state is indeterminate
void loop(loop_state *state) {
  while (Serial.available()) {
    byte received = Serial.read(); // Store received byte
    if (received >= '0' || received <= '9') { // or isdigit((unsigned char) received)
      if (state->counter >= 0) {
        state->counter++;
        unsigned digit = received - '0';
        if (state->number >= UINT32_MAX / 10
            && (state->number > UINT32_MAX / 10 || digit > UINT32_MAX % 10)) {
          // overflow
          state->counter = -1;
          continue;
        }
        state->number = state->number * 10 + digit;
      }
    } else if (isspace((unsigned char) received)) {
      if (state->counter == 1) {
        Serial.println(state->number);
      }
      state->number = 0;
      state->counter = 0;
    } else {
      state->number = 0;
      state->counter = -1;
    }
  }
}
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/240173

复制
相关文章

相似问题

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