(Serial.available() > 0) 等待用户输入
(Serial.available() > 0) waits for user input
我在 Arduino 中遇到用户输入问题 ide。我希望 arduino 定期检查用户是否生成了一些输入字符串(arduino 每 3 秒检查一次),但即使 3 秒后没有输入(string order =“”)arduino 等待用户输入,然后当我输入内容时它退出 "checkIncomingOrder" 函数并再等待 3 秒。如果有任何建议,我将不胜感激。我的简单代码如下:
String order = "";
int timer;
void setup() {
Serial.begin(9600);
timer = 0;
}
void loop() {
if (timer == 3)
{
checkIncomingOrder();
}
else
{
delay(1000);
Serial.println("waiting");
timer++;
}
}
void checkIncomingOrder() {
if (Serial.available() > 0) {
order = Serial.readStringUntil('\n');
}
if (order == "") {
return;
} else {
Serial.println("Order is: " + order);
order = "";
timer = 0;
}
}
Serial::Available()
不阻塞。如果有可用字符,将调用 readStringUntil()
,但在换行符可用之前不会 return - 因此这可能是您输入阻塞的地方。
以下可能是更安全的非阻塞解决方案:
void checkIncomingOrder()
{
char ch = 0 ;
while( ch != '\n' && Serial.available() > 0 )
{
Serial.readBytes( &ch, 1 ) ;
order += ch ;
}
if( ch == '\n' )
{
Serial.println("Order is: " + order) ;
order = "" ;
timer = 0 ;
}
}
它允许您连续检查一行输入,而不是每三秒检查一次 - 使解决方案响应更快:
void loop()
{
checkIncomingOrder();
}
允许依次删除 timer
变量。
我在 Arduino 中遇到用户输入问题 ide。我希望 arduino 定期检查用户是否生成了一些输入字符串(arduino 每 3 秒检查一次),但即使 3 秒后没有输入(string order =“”)arduino 等待用户输入,然后当我输入内容时它退出 "checkIncomingOrder" 函数并再等待 3 秒。如果有任何建议,我将不胜感激。我的简单代码如下:
String order = "";
int timer;
void setup() {
Serial.begin(9600);
timer = 0;
}
void loop() {
if (timer == 3)
{
checkIncomingOrder();
}
else
{
delay(1000);
Serial.println("waiting");
timer++;
}
}
void checkIncomingOrder() {
if (Serial.available() > 0) {
order = Serial.readStringUntil('\n');
}
if (order == "") {
return;
} else {
Serial.println("Order is: " + order);
order = "";
timer = 0;
}
}
Serial::Available()
不阻塞。如果有可用字符,将调用 readStringUntil()
,但在换行符可用之前不会 return - 因此这可能是您输入阻塞的地方。
以下可能是更安全的非阻塞解决方案:
void checkIncomingOrder()
{
char ch = 0 ;
while( ch != '\n' && Serial.available() > 0 )
{
Serial.readBytes( &ch, 1 ) ;
order += ch ;
}
if( ch == '\n' )
{
Serial.println("Order is: " + order) ;
order = "" ;
timer = 0 ;
}
}
它允许您连续检查一行输入,而不是每三秒检查一次 - 使解决方案响应更快:
void loop()
{
checkIncomingOrder();
}
允许依次删除 timer
变量。