Arrays Serial.readBytesUntil()给出垃圾值,并使setup()函数的行为类似于循环。
我正在尝试使用Serial.readBytesUntil()函数读取字符串。我的代码在这里: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
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’。你确定它可以上传吗?”?