Arrays ArrayIndexOutOfBoundsException:2-超出数组的边界?
我正在从Arduino发送3个传感器值,以处理并将字符串拆分为数组中的三个元素。 有时当我运行程序时,我会得到ArrayIndexOutOfBoundsException:2错误,据我所知,这意味着我试图访问数组中不存在的元素。 我做错了什么 我的处理和Arduino代码如下: 处理: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
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个元素,这将防止运行时错误发生,但无法解决根本问题。