我想了解如何在不使用Serial.parseInt()的情况下在变量中写入和存储整数。我找不到关于这方面的任何代码示例。也许这是正确的方法,虽然它不检测和大写字母和特殊字符。请留下一些关于改进方法的反馈意见。谢谢!)
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;
}
}
}发布于 2020-04-11 21:25:52
要获得更健壮的代码来检测非数字输入、溢出和启动阶段,请考虑使用状态机。
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;
}
}
}https://codereview.stackexchange.com/questions/240173
复制相似问题