Serial.readBytesUntil() 给出垃圾值并导致 setup() 函数像循环一样运行。

Serial.readBytesUntil() gives garbage value and cause setup() function act like loop.

我正在尝试使用 Serial.readBytesUntil() 函数读取字符串。我的代码在这里:

char *name_arr;
char *test = "Serial.begin is Ready";

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

void loop(){
  if (Serial.readBytesUntil('\r', name_arr, 10)){    
     Serial.println(name_arr);
     Serial.println();
  }
}

当我只给出一个数字作为串行输入时,happens.Serial.println() 函数什么都不打印。

但是当我输入多于两位的数字(如 15,12 等)时,它开始无限循环地打印垃圾值。

如果我提供 "asd" 之类的字符输入或将此代码用于 loop() 而不是之前的代码: void loop(){ while (Serial.available()>0){ Serial.readBytesUntil('\r', name_arr, 10); Serial.println(name_arr); Serial.println(); }

然后打印整个字符串 "test" 除了前两个 characters.But 测试仅在设置函数中打印:

似乎 setup() 函数 运行 一次又一次。

如何将字符串输入保存在字符数组中(而不是字符串 class)?

函数如何重新运行 设置函数以及为什么不打印前两位数字?

readBytesUntil 将在第二个参数中存储字节(参见 here),但您只声明了一个 指针 ,而不是 数组。指针默认指向地址 0,因此 readBytesUntil 将字符存储在地址 0。糟糕,非常糟糕。这导致了重置,看起来 setup 一遍又一遍地保持 运行。

您需要将声明更改为:

char name_array[11];

此外,不要忘记 C 风格的字符串(即 char 数组)需要以 NUL 结尾。 readBytesUntil returns 它读取的字符数,您可以使用该 return 值来终止字符串:

size_t num_read = Serial.readBytesUntil('\r', name_arr, sizeof(name_arr)-1 ));
name_arr[ num_read ] = '[=11=]'; // a zero byte, ASCII NUL

这就是打印不正确的原因。请注意,声明有一个额外的字节用于 NUL(“11”,而不是“10”),readBytesUntil 的第三个参数是数组大小减 1。

总草图:

char name_arr[11];
char *test = "Serial.begin is Ready";

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

void loop(){
  while (Serial.available()) {
    size_t num_read = Serial.readBytesUntil('\r', name_arr, sizeof(name_arr)-1 );
    name_arr[num_read] = '[=12=]';
    Serial.println(name_arr);
    Serial.println();
  }
}