Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Serial.readBytesUntil()给出垃圾值,并使setup()函数的行为类似于循环。_Arrays_Arduino_Serial Port - Fatal编程技术网

Arrays Serial.readBytesUntil()给出垃圾值,并使setup()函数的行为类似于循环。

Arrays Serial.readBytesUntil()给出垃圾值,并使setup()函数的行为类似于循环。,arrays,arduino,serial-port,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.printl

我正在尝试使用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等,它开始在无限循环中打印垃圾值。

如果我提供类似“asd”的字符输入,或者将此代码用于loop()而不是前一个:

void循环(){
while(Serial.available()>0){
Serial.readBytesUntil('\r',name_arr,10);
序列号:println(名称);
Serial.println();
}

然后打印除前两个字符外的整个字符串“test”。但test仅在设置函数中打印:

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

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


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

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

您需要将声明更改为:

char name_array[11];
另外,不要忘记C样式字符串(即字符数组)需要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();
  }
}

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

您需要将声明更改为:

char name_array[11];
另外,不要忘记C样式字符串(即字符数组)需要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();
  }
}

Thnx很多,现在它正确地打印了。除了它在没有第一个数字的情况下再次打印外。就像我输入的“anklon”。然后它会打印“anklon”。这很好,但在此之后,它会自动打印“nklon”。并且它不打印名称。\u arr[0]character:3您没有发布新代码,但我能够复制它。您是否在
num\u read=Serial.readBytes…
之后NUL终止字符串?我在上面添加了整个草图是的,我添加了NULL terminate。我的代码实际上与您的代码相同。在串行监视器窗口中,右下角的下拉菜单是否显示“NL和CR”?就在波特率下拉列表的左侧。这将导致它打印两件事:您输入的行,直到NL,然后是串行监视器发送的额外CR的空行。如果您没有
name\u arr[num\u read]='\0'
,则第二次打印显示“nklon”“因为CR踩到了‘a’。你确定它上载了吗?Thnx很多,现在它打印正确。除了它没有第一个数字再次打印。就像我输入的‘anklon’。然后它会打印‘anklon’。这很好,但在此之后,它会自动打印‘nklon’。并且它不会打印名称。\u arr[0]character:3您没有发布新代码,但我能够复制它。您是否在
num\u read=Serial.readBytes…
之后NUL终止字符串?我在上面添加了整个草图是的,我添加了NULL terminate。我的代码实际上与您的代码相同。在串行监视器窗口中,右下角的下拉菜单是否显示“NL和CR”?就在波特率下拉列表的左侧。这将导致它打印两件事:您输入的行,直到NL,然后是串行监视器发送的额外CR的空行。如果您没有
name\u arr[num\u read]='\0'
,则第二次打印显示“nklon”“因为CR踩到了‘a’。你确定它可以上传吗?”?