【问题标题】:ArrayIndexOutOfBoundsException: 2 - Going out of bounds of array?ArrayIndexOutOfBoundsException: 2 - 超出数组范围?
【发布时间】:2021-04-16 13:08:16
【问题描述】:

我将 3 个传感器值从 Arduino 发送到处理并将字符串拆分为数组中的三个元素。 有时当我运行程序时,我会收到 ArrayIndexOutOfBoundsException: 2 错误,据我了解,这意味着我正在尝试访问数组中不存在的元素。 我做错了什么?

我的 Processing 和 Arduino 代码如下:

处理:

import processing.serial.*;

Serial port;
float background;
float r1;
int a;
int b;
int c;
PrintWriter output;
Databox Data1 = new Databox(20, 20);
Databox Data2 = new Databox(20, 190);
Databox Data3 = new Databox(20, 360);

void setup() {
  size (690, 530);
  port = new Serial(this, "COM3", 9600);
  output = createWriter(hour() + "." + minute() + "." + second() + ".txt");
}

void draw() {
  background(60, 40);
  Data1.drawDataboxHumi();
  Data2.drawDataboxTemp();
  Data3.drawDataboxMoist();

  if (port.available() > 0) {
    String inString = port.readStringUntil('\n');
    if (inString != null) {
      inString = trim(inString);
      String[] data = split(inString, '#');

      a = int(data[0]);
      b = int(data[1]);
      c = int(data[2]);

      output.println("Tidspunkt:" + " " + hour() + ":" + minute() + ":" + second() + " - " 
        + "Luftfugtighed:" + a +"%" + " "+ "Temperatur:" + b + " " + "Jordfugtighed:" + " " + c);
      output.flush();
    }
  }
}

阿杜诺:

#include <dht.h>

dht DHT;

#define DHT11_PIN 7

void setup() {
  Serial.begin(9600);
  pinMode(A0, INPUT);
}

void loop() {
  int SensorValue = analogRead(A0); 
                                      

  int chk = DHT.read11(DHT11_PIN);

  Serial.print(DHT.humidity);
  Serial.print("#");
  Serial.print(DHT.temperature);
  Serial.print("#");
  Serial.print(SensorValue);
  Serial.println("#");
  delay(1500);
}

【问题讨论】:

    标签: arrays string split arduino processing


    【解决方案1】:

    尝试检查(通过打印)port.readStringUntil('\n') 每次返回的内容准确,并以同样的方式检查 trim() 之后的剩余内容。

    有时可能是readStringUntil() 超时,然后只返回0,这是一个没有任何#s 的字符串,它会将split 转换为一个1 元素数组。它也可能以某种方式读取留在缓冲区中的虚假数据,效果相同。

    找出答案的唯一方法是检查上面所说的 inString。

    您可以通过在处理单个数组元素之前检查String[] data 中的元素数量来防止运行时错误,但这并不能解决根本问题。不过,对于您的目的来说,它可能已经足够好了。

    几点说明:

    您不需要从 Arduino 发送最后一个 (3rd) #;您只需要 2 个即可将 Arduino String 拆分为 3 个部分,而拥有 3 个 #s 可能会导致 split 产生 4 个部分。不过,它最后需要一个\n

    【讨论】:

    • 它似乎没有超时。我删除了第三个“#”,但没有明显改善。当我删除它时,当我运行程序时,第三个数据输出“SensorValue”在处理中被绘制为 0。
    • 在屏幕上打印 inString 行 String inString = port.readStringUntil('\n'); 之后的内容确切地说,在 inString = trim(inString); 行之后的 inString 是什么我怀疑它会告诉你出了什么问题。
    • 另外,如果你把Arduino上的delay()减少到800,试试看它是否正常工作; readStringUntil() 的默认超时时间为 1 秒。另请参阅编辑后的答案。
    • Trim 似乎什么也没做,所以我删除了它。该代码基于我几个月前进行的一项旧练习,所以它只是剩下的。这个问题现在似乎也已经解决了。我插入了一个 if 语句 if (data.length == 4){ a = int(data[0]); b = int(数据[1]); c = int(数据[2]); } 在 String[] 之后数据 = split(inString, '#');它似乎完成了这项工作。数组中有 4 个元素,但我无法通过删除 Arduino 中的“#”来仅使用 3 个元素
    • 这将防止发生运行时错误,但不能解决根本问题。
    猜你喜欢
    • 2021-11-14
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多