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