在Arduino中通过串行发送整数

sending integers over serial in arduino

我正在尝试在ardunio IDE中使用串行监视器通过串行发送整数(然后在使用串行监视器调试后从树莓派中获取python的python),并且可以使单个数字与下面的代码一起使用,但是使用10或100,它将自动将下一个变量填充为0。我尝试使用serial.readString,然后将其转换为int,但这也会引发错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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);

}


让我们考虑一下您的函数在做什么。

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,并且不必等到超时就可以。

如果您希望代码永远等待下一次输入,请在下一次调用parseInt之前选中Serial.available > 0。您已经从接收缓冲区中读取了每个数字,因此,除非确定您将在一秒钟内收到另一个数字,否则立即调用parseInt是没有意义的。