Исключение нулевого указателя при обработке (ldrValues) - PullRequest
1 голос
/ 20 апреля 2019

Мой код включает в себя как Обработка, так и Arduino.5 разных фотоэлементов запускают 5 разных звуков.Мои звуковые файлы воспроизводятся только тогда, когда значение ldrvalue превышает пороговое значение.

В этой строке выделено исключение нулевого указателя

for (int i = 0; i < ldrValues.length; i++) {

Я не уверен, какая часть моего кода должна быть изменена, поэтомучто я могу его запустить.

import processing.serial.*;
import processing.sound.*;

SoundFile[] soundFiles = new SoundFile[5];
Serial myPort;  // Create object from Serial class

int[] ldrValues;
int[] thresholds = {440, 490, 330, 260, 450};
int i = 0;
boolean[] states = {false, false, false, false, false};

void setup() {
  size(200, 200);


  println((Object[])Serial.list());

  String portName = Serial.list()[3];
  myPort = new Serial(this, portName, 9600);


  soundFiles[0] = new SoundFile(this, "1.mp3");
  soundFiles[1] = new SoundFile(this, "2.mp3");
  soundFiles[2] = new SoundFile(this, "3.mp3");
  soundFiles[3] = new SoundFile(this, "4.mp3");
  soundFiles[4] = new SoundFile(this, "5.mp3");
}

void draw()
{
  background(255);             

  //serial loop
  while (myPort.available() > 0) {
    String myString = myPort.readStringUntil(10);
    if (myString != null) {
      //println(myString);
      ldrValues = int(split(myString.trim(), ','));
      //println(ldrValues);
    }
  }

  for (int i = 0; i < ldrValues.length; i++) {
    println(states[i]);
    println(ldrValues[i]);
    if (ldrValues[i] > thresholds[i] && !states[i]) {
      println("sensor " + i + " is activated");
      soundFiles[i].play();
      states[i] = true;
    }
    if (ldrValues[i] < thresholds[i]) {
      println("sensor " + i + " is NOT activated");
      soundFiles[i].stop();
      states[i] = false;
    }
  }
}

1 Ответ

0 голосов
/ 20 апреля 2019

Ваш подход, скажем так, оптимистичный? :)

Всегда предполагается, что было сообщение от Serial, всегда правильно отформатировано, чтобы его можно было проанализировать, и было абсолютно 0 проблем с буферизацией данных (неполные строки и т. Д.))

Самое простое, что вы можете сделать, это проверить, был ли разбор успешным, иначе массив ldrValues все равно будет нулевым:

void draw()
{
  background(255);             

  //serial loop
  while (myPort.available() > 0) {
    String myString = myPort.readStringUntil(10);
    if (myString != null) {
      //println(myString);
      ldrValues = int(split(myString.trim(), ','));
      //println(ldrValues);
    }
  }
  // double check parsing int values from the string was successfully as well, not just buffering the string  
  if(ldrValues != null){
    for (int i = 0; i < ldrValues.length; i++) {
      println(states[i]);
      println(ldrValues[i]);
      if (ldrValues[i] > thresholds[i] && !states[i]) {
        println("sensor " + i + " is activated");
        soundFiles[i].play();
        states[i] = true;
      }
      if (ldrValues[i] < thresholds[i]) {
        println("sensor " + i + " is NOT activated");
        soundFiles[i].stop();
        states[i] = false;
      }
    }
  }else{
    // print a helpful debugging message otherwise
    println("error parsing ldrValues from string: " + myString);
  }


}

(Не знал, что вы можете разобрать int[] с int(): приятно!)

...