带有Serial.available()的Arduino草图经过两次
当我在循环函数中测试Serial.available或Serial.available>0时,每次输入串行数据时,它都会返回两次true。第二次,它将代码中的油门值设置为0。代码如下:带有Serial.available()的Arduino草图经过两次,arduino,serial-port,Arduino,Serial Port,当我在循环函数中测试Serial.available或Serial.available>0时,每次输入串行数据时,它都会返回两次true。第二次,它将代码中的油门值设置为0。代码如下: #include <Servo.h> Servo rc_rotor; int throttle = 0; // servo position indicates throttle position. String s_throttle_set = "Throttle set to: "; Str
#include <Servo.h>
Servo rc_rotor;
int throttle = 0; // servo position indicates throttle position.
String s_throttle_set = "Throttle set to: ";
String s_throttle_read = "Reading throttle value: ";
String s_action_error = "No action known for input value: ";
void setup()
{
rc_rotor.attach(9);
Serial.begin(9600);
while(! Serial);
Serial.println("Throttle value: 0 through 255, or 999 to read current value.");
}
void loop()
{
rc_rotor.write(throttle);
delay(20);
if (Serial.available())
{
int temp_throttle = Serial.parseInt();
if (temp_throttle >= 0 && temp_throttle <= 180)
{
throttle = temp_throttle;
Serial.println(s_throttle_set + throttle);
}
else if (temp_throttle == 999)
{
Serial.println(s_throttle_read + throttle);
}
else
{
Serial.println(s_action_error + temp_throttle);
}
}
}
请注意,这段代码不是我最后的杰作。其中大部分来自公开的例子。无论如何,如果Serial.available语句将成功两次。我的意思是,当我输入125这样的值时,它是真的,过一会儿,当我没有输入任何其他值时,它将再次是“真的”。我只希望通过这种方式得到一个值。结果是我的油门被设置为我输入的值,然后几乎立即重新设置为0。为什么会出现这种情况?事实证明,硬件或代码没有什么神秘的问题,正如我最初怀疑的那样。实际上,解决方案只是在默认情况下选择Arduino串行监视器下拉选项中的无行结束,我猜我的设置为New line。如果串行监视器没有插入额外的字符,一切都会按预期进行 有一件事我没有想到,那就是Arduino软件是如何解释这条新线的。我通过打印通过if语句生成的ascii值进行调试。首先,串行监视器发送我输入的数字,然后是ascii 10,这是换行符。好的,没问题。但是Serial.parseInt在这个换行符上咀嚼了一会儿,出现了一个轻微但明显的延迟,然后将数字0输入到我的函数中。我花了一点时间才弄明白原因。以下是Arduino语言参考系列部分的说明: 帕森特 描述 查找传入串行流中的下一个有效整数。 parseInt继承自流实用程序类 特别是: 跳过不是数字或减号的初始字符; 当未读取可配置文件的任何字符时,解析停止 超时值,或读取非数字; 如果没有读取有效数字 当出现超时see Serial.setTimeout时,返回0; 因此,当换行符位于缓冲区中时,Serial.available为true,但根据Serial.parseInt,换行符不是有效数字。可以理解地因此,Serial.parseInt返回0,随后的代码将继续该值 问题中的代码假设唯一的输入是串行连接上的整数,这实际上是一个非常脆弱的假设。如果需要在换行符或其他字符将通过的情况下使用Serial.parseInt,那么只需比我在示例代码中更好地过滤输入即可