【问题标题】:Processing Serial Read from Arduino causing Java PApplet error处理来自 Arduino 的串行读取导致 Java PApplet 错误
【发布时间】:2015-04-07 15:22:25
【问题描述】:

我正在从上传到 teensy 2.0 的 arduino 草图中读取串行数据/运行常规 arduino 时也会发生这种情况。然后,我将字符串拆分并使用 Processing 的 int() 函数转换为整数数组,以便能够触发声音。 arduino 草图正在读取电容传感器数据。它运行了大约 10-15 秒,然后开始抛出以下错误。


 Exception in thread "Animation Thread" java.lang.NullPointerException
        at processing.core.PApplet.parseInt(PApplet.java:9127)
        at processing.core.PApplet.parseInt(PApplet.java:9113)
        at NightGames_Tree.draw(NightGames_Tree.java:59)
        at processing.core.PApplet.handleDraw(PApplet.java:2266)
        at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:243)
        at processing.core.PApplet.run(PApplet.java:2140)
        at java.lang.Thread.run(Thread.java:695)

我的代码如下: 在 Arduino 中:

 #include <CapacitiveSensor.h>

CapacitiveSensor   cs_4_2 = CapacitiveSensor(4,2);        

void setup()                    
{
   cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);     // turn off autocalibrate on channel 1 - just as an example
   Serial.begin(9600);
}

void loop()                    
{
    long start = millis();
    long total1 =  cs_4_2.capacitiveSensor(30);

    Serial.print(millis() - start);        // check on performance in milliseconds
    Serial.print("\t");                    

    Serial.print(total1);                  // print sensor output 1
    Serial.println("\t");

    delay(100);                            
}

处理中:

    import ddf.minim.spi.*;
    import ddf.minim.signals.*;
    import ddf.minim.*;
    import ddf.minim.analysis.*;
    import ddf.minim.ugens.*;
    import ddf.minim.effects.*;

    import processing.serial.*;

    Minim minim;
    AudioPlayer tree1;
    AudioPlayer tree2;

    Serial myPort;
    String val;

void setup(){

    String portName = Serial.list()[12]; // calls on the port which teensy is on
    myPort = new Serial(this, portName, 9600);
    println(Serial.list()); // prints list of ports that processing can access

    //setup sound

    minim = new Minim(this);
    tree1 = minim.loadFile("tree1.aif");

}

void draw()
{


    if (myPort.available() > 0) {
        val = myPort.readStringUntil('\n');
        int[] list = int(split(val, '\t')); // splits string into list based on tab after
    int sum = 0;
    int sum1 = 0;
 //  print(list.length);

      sum = sum + list[0];
      sum1 = sum1 + list[1];

    print(sum);
    print('\t');
    print(sum1);
    print('\t');
    print('\n');

   //print(val);

    if (sum1 > 500) {
      tree1.play(0);
    } else if (sum1 <500){
    }

  }
}

运行一段时间后出现错误时,Processing会高亮显示这行代码

int[] list = int(split(val, '\t'));

提前感谢您的帮助。我在 Mac 上运行它。

【问题讨论】:

  • 你检查过split的输出了吗? NullPointerException 表示您正在尝试解析 null 参数。
  • 谢谢 Khaled,最好的方法是什么?我正在打印下面拆分的值。
  • 你可以使用split,然后遍历结果数组并检查是否有null,打印出来的东西表明你找到了null值。
  • 谢谢哈立德,检查 null 完全解决了这个问题。我用了一个布尔值。

标签: java arduino processing


【解决方案1】:

我在 Windows 机器上运行了这个,使用 Processing 3.0a4 和 Arduino 1.6.3 在 Arduino 上,我注释掉了与电容传感器库有关的所有内容,因为我没有它。 `

//#include <CapacitiveSensor.h>
//CapacitiveSensor   cs_4_2 = CapacitiveSensor(4,2);        
void setup()                    
{
// cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);     
// turn off autocalibrate on channel 1 - just as an example

Serial.begin(9600); }

void loop()                    
{
long start = millis();
// long total1 =  cs_4_2.capacitiveSensor(30);

Serial.print(millis() - start);        
// check on performance in milliseconds
Serial.print("\t");                    

//Serial.print(total1);                  // print sensor output 1
Serial.println("\t");

delay(100);                            
}

在处理中,我用声音文件注释掉了这一行。 我得到的错误指向这一行:

int[] list = int(split(val, '\t'));

似乎可能存在类型不匹配,允许列表流式传输一小段时间,但它们堵塞了处理器。

【讨论】:

    【解决方案2】:

    原来处理是检测一个空对象,所以添加一个空对象检查解决了这个问题。精简后的代码是:

    import processing.serial.*;
    
    Serial myPort;
    String val;
    
    void setup(){
      String portName = Serial.list()[12]; // calls on the port which teensy is on
      myPort = new Serial(this, portName, 9600);
    } 
    
    void draw()
    {
      if (myPort.available() > 0) {
        val = myPort.readStringUntil('\n');
        if (val!=null){
        int[] list = int(split(val, '\t')); // splits string into list based on tab 
    
        int sum = 0;
        int sum1 = 0;
        int sum2 = 0;
    
        sum = sum + list[0];
        sum1 = sum1 + list[1];
        sum2 = sum2 + list[2];
    
        print(sum);
        print('\t');
        print(sum1);
        print('\t');
        print(sum2);
        print('\t');
        print('\n');
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多