Arrays ArrayIndexOutOfBoundsException:2-超出数组的边界?

Arrays ArrayIndexOutOfBoundsException:2-超出数组的边界?,arrays,string,split,arduino,processing,Arrays,String,Split,Arduino,Processing,我正在从Arduino发送3个传感器值,以处理并将字符串拆分为数组中的三个元素。 有时当我运行程序时,我会得到ArrayIndexOutOfBoundsException:2错误,据我所知,这意味着我试图访问数组中不存在的元素。 我做错了什么 我的处理和Arduino代码如下: 处理: import processing.serial.*; Serial port; float background; float r1; int a; int b; int c; PrintWriter out

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

我的处理和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);
}
#包括
dht-dht;
#定义DHT11_引脚7
无效设置(){
Serial.begin(9600);
引脚模式(A0,输入);
}
void循环(){
int传感器值=模拟读数(A0);
int chk=DHT.read11(DHT11_引脚);
串行打印(DHT湿度);
序列号。打印(“#”);
串行打印(DHT温度);
序列号。打印(“#”);
串行打印(传感器值);
Serial.println(“#”);
延迟(1500);
}
尝试检查(通过打印)端口的内容。readStringUntil('\n')每次都准确返回,并以相同的方式检查
修剪()后剩余的内容。

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

找到答案的唯一方法是如上所述检查仪表

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

几句话:


您不需要从Arduino发送最后一(3)个
#
;将Arduino
字符串
拆分为3个部分只需要2个,如果有3个
#
s,可能会导致
拆分
产生4个部分。不过,最后需要一个
\n

它似乎没有超时。我删除了第3个“#”,但没有明显的改进。当我删除它时,当我运行程序时,第三个数据输出“SensorValue”在处理过程中被绘制为0。打印到屏幕上,在字符串inString=port.readStringUtil('\n')之后显示inString是什么;准确地说,在inString=trim(inString)线之后是什么inString;我怀疑它会告诉你出了什么问题。另外,如果你将Arduino上的
delay()
减少到800,试着看看它是否工作正常
readStringUntil()
的默认超时时间为1s。另请参见编辑后的答案。Trim似乎什么也没做,所以我将其删除。代码是基于几个月前我做的一个旧练习,所以它只是一个遗留下来的东西。这个问题现在似乎也已经解决了。我在字符串[]data=split(inString,“#”)之后插入了if语句if(data.length==4){a=int(data[0]);b=int(data[1]);c=int(data[2]);它似乎完成了任务。数组中有4个元素,但我无法通过删除数组中的“#”来让它仅使用3个元素,这将防止运行时错误发生,但无法解决根本问题。