2015-04-07 2 views
0

Я читаю серийные данные из эскиза arduino, который я загрузил в teensy 2.0/это также происходит при запуске обычного arduino. Затем я разделяю строки и преобразую их в целочисленный массив с функцией обработки()(), чтобы иметь возможность запускать звуки. Эскиз arduino считывается в емкостных данных датчика. Он работает хорошо около 10-15 с, а затем начинает выдавать следующую ошибку.Обработка последовательного чтения от Arduino, вызывающего ошибку Java PApplet


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){ 
    } 

    } 
} 

Когда ошибка появляется после запуска на некоторое время , Обработка подчеркивает эту строку кода

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

Заранее благодарим за любую помощь. Я запускаю это на Mac.

+0

Вы проверили выход «split»? «NullPointerException» означает, что вы пытаетесь проанализировать аргумент «null». –

+0

Спасибо, Халед, какой был бы лучший способ сделать это? Я печатаю значения из разделенного ниже. – Alien

+0

Вы можете использовать 'split', затем перебрать полученный результирующий массив и проверить, что что-то« null », распечатать что-то, чтобы указать, что вы нашли значение« null ». –

ответ

0

Я запускал это на ящике 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'));

Возможно, существует несоответствие типа, которое позволяет перечислить поток для короткого бита, но они замявают процессор.

0

Обработка завершается, обнаруживая нулевой объект, поэтому добавление проверки для нулевых объектов решает проблему. Конденсированный код:

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'); 
    } 
    } 
} 
Смежные вопросы