这是令人沮丧的一天,向Arduino tut学习。
我正在设置伺服电机。我解决了为什么无法让它接收数据的问题,现在我通过串行端口读取并转至适当的角度。但是现在看来,每次循环时,它都会尝试将其值重置为0度。我尚未将变量分配为0,而while循环在等待用户输入时应该像中断一样工作。所以我不明白为什么要这么做。
我还尝试返回值pos
,以防止在每个循环中更改/重置值,但会不断出现编译错误。我有一个说法是pos
返回void
。然后,当我尝试将int pos
声明为循环内的一种方法并将其余代码嵌套在int方法内时,我得到了另一个。
还有一个有趣的旁注:当您在IDE中启动串行端口窗口时,即使没有输入任何输入,它也会使电机旋转少量。输入给定的输入后,它将达到这些程度,然后如前所述进行重置。
代码:
#include <Servo.h> //Including the Servo code library
int servoPin = 6;
int servoDelay = 25;
int pos;
Servo myPointer; // Create a Servo object called myPointer
void setup() {
Serial.begin(9600);
//pinMode (servoPin, OUTPUT);
myPointer.attach(servoPin);
Serial.println("Hello");
}
void loop() {
Serial.println ("Where would you like the servo to point?");
while (Serial.available()==0){
}
pos = Serial.parseInt();
Serial.println (pos);
myPointer.write(pos);
}
伺服器正在使用Arduino上的5V电源供电,并收到OK指令。在通过void setup()运行时,它不会重置位置,因此这必须是导致此问题的循环。我只是不知道为什么或如何解决它。
答案 0 :(得分:0)
在开始解析消息之前,请确保已收到整个消息。在使用前,请将Serial.setTimeout()
(默认值为1s)之间的字符间距设置为较大的值:
Serial.setTimeout(2000);
while (Serial.available() == 0) {}
duration = Serial.parseInt();
或者如果上述方法不能解决您的所有问题,请在Serial.available()
和Serial.parseInt()
之间添加延迟。
while (Serial.available() == 0) {}
delay(4000);
duration = Serial.parseInt();
Serial.available()
将落在接收到的第一个字符上。所以:
也可能存在诸如\n
或\r
之类的其他字符来触发解析,但是没有有意义的数据。如果Serial.parseInt()
未能转换数字,则返回0。所以:
\n
或\r
。Serial.flush()
后的接收缓冲区为空,以摆脱所有剩余的\n
或\r
字符。