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

时间:2015-11-08 23:56:04

标签: arrays arduino serial-port

我正在尝试使用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();
  }
}

当我只给出一个数字作为串行输入时,没有任何反应.Serial.println()函数不打印任何内容。

但是当我输入更多的两个数字,如15,12等时,它开始在无限循环中打印垃圾值。 This is output's screen shot:

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

然后它打印整个字符串" test"除了前两个字符。但是只在设置功能中打印测试: creepy output

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

如何在字符数组中保存字符串输入(不在字符串类中)?

一个函数怎么可以重新运行设置函数以及为什么不打印最初的两位数?

1 个答案:

答案 0 :(得分:3)

readBytesUntil将在第二个参数中存储字节(请参阅here),但您只声明了指针,而不是数组。指针默认为零地址,因此readBytesUntil在地址0处存储字符。糟糕,非常糟糕。这导致重置,看起来setup一直在反复运行。

您需要将声明更改为:

char name_array[11];

另外,不要忘记C样式字符串(即char数组)需要NUL终止。 readBytesUntil返回它读取的字符数,您可以使用该返回值来终止字符串:

size_t num_read = Serial.readBytesUntil('\r', name_arr, sizeof(name_arr)-1 ));
name_arr[ num_read ] = '\0'; // 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] = '\0';
    Serial.println(name_arr);
    Serial.println();
  }
}