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
带有Serial.available()的Arduino草图经过两次_Arduino_Serial Port - Fatal编程技术网

带有Serial.available()的Arduino草图经过两次

带有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

当我在循环函数中测试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: ";
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,那么只需比我在示例代码中更好地过滤输入即可