我正在尝试使用ardunio IDE中的串行监视器通过串行发送整数(然后在使用串行监视器调试后从树莓派中获取python的python),并且可以使单个数字与下面的代码一起使用,但是使用10或100,它将自动将下一个变量填充为0。我尝试使用serial.readString
然后将其转换为int,但这也会引发错误。
int varX = 0;
int varY = 0;
int varZ = 0;
int varCounter = 0;
void setup() {
Serial.begin(115200);
grabNewVars();
}
void grabNewVars()
{
while (varCounter < 3)
{
if (Serial.available() > 0) {
if (varCounter ==0)
{
varX = Serial.parseInt();
}
if (varCounter ==1)
{
varY = Serial.parseInt();
}
if (varCounter ==2)
{
varZ = Serial.parseInt();
}
varCounter++;
}
}
}
void loop()
{
Serial.println("varX = " + String(varX));
Serial.println("varY = " + String(varY));
Serial.println("varZ = " + String(varZ));
Serial.println("variables received, run main loop");
delay(100000);
}
答案 0 :(得分:1)
让我们考虑一下您的函数在做什么。
Serial.available()返回接收缓冲区中可用的字节数。
Serial.parseInt()读取任何数字,直到接收到非数字字符,或者如果在1秒钟内未接收到数字,则超时(默认)。在这种情况下,它将返回0。
因此,在while循环中,您通过检查Serial.available() > 0.
您输入100(无行结尾)。现在,接收缓冲区中有内容,并且varCounter为0,执行varX = Serial.parseInt();
parseInt将在1秒后超时,并返回在1秒钟内收到的100。
100存储在varX中,而varCounter递增1。
现在您执行varY = Serial.parseInt();
由于您很可能在一秒钟内没有输入其他数字,这将超时,并且您将0存储在varY中。
用非数字字符结束您的电话号码。例如,通过选择以串行监视器结尾的行或通过从Python代码发送换行符或回车符来实现。或任何其他单个非数字字符。这样,Arduino便知道已收到完整的Integer,而不必等到超时。
如果您希望代码永远等待下一次输入,请在下次调用Serial.available > 0
之前选中parseInt
。您已经从接收缓冲区中读取了每个号码,因此除非立即确定会在一秒钟内收到另一个号码,否则立即致电parseInt
是没有道理的。