在Arduino中通过串行发送整数

时间:2019-10-18 09:22:52

标签: arduino

我正在尝试使用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);

}

1 个答案:

答案 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是没有道理的。