如何解决ArrayIndexOutOfBoundsException: 2 - 超出数组边界?
我将 3 个传感器值从 Arduino 发送到 Processing 并将字符串拆分为数组中的三个元素。 有时当我运行程序时,我会收到 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);
}
解决方法
尝试检查(通过打印)port.readStringUntil('\n')
每次返回什么完全,并以同样的方式检查 trim()
之后剩下的内容。
有时可能是 readStringUntil()
超时,然后只返回 0
,这是一个没有任何 #
的字符串,这将 split
变成一个 1 元素大批。它也可能以某种方式读取留在缓冲区中的虚假数据,具有相同的效果。
找出答案的唯一方法是检查上面所说的 inString。
您可以通过在处理单个数组元素之前检查 String[] data
中的元素数量来防止运行时错误,但这并不能解决潜在的问题。不过,它可能足以满足您的目的。
几点说明:
您不需要从 Arduino 发送最后一个 (3rd) #
;您只需要 2 个就可以将 Arduino String
分成 3 个部分,并且有 3 个 #
可能会导致 split
产生 4 个部分。不过,它最后需要一个 \n
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。