1

シリアル入力を受け入れ、受信したデータをCOSMサーバーにアップロードするJavaプログラムに取り組んでいます。シリアルポートから受信したデータを格納するグローバル変数は、COSMの更新に使用されたメソッドでその値を再現しません。誰かがこれの何が問題になっているのか教えてもらえますか?以前にグローバルキューオブジェクトを使用したこともありますが、キューオブジェクトでremoveが呼び出されると、updateメソッドNullPointerExceptionがスローされます。

public synchronized void serialEvent(SerialPortEvent oEvent)//Event handler for serial communication 
{

    if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) 
    {
        try {

        val = input.read(); 

        this.update(78164);  

    } catch (PachubeException e) {
        // If an exception occurs it will print the error message from the
        // failed HTTP command
        System.err.println(e.errorMessage);
        //System.out.println("Main method");

    } catch (IOException e) {
        System.err.println(e);
        //  System.out.println("Main method");

    } catch (Exception e) {
        //   System.out.println("Main method");
        System.err.println(e);
    }
}

valグローバル変数です。updateメソッドで呼び出されると、の値valはゼロまたは20になります(の値valはその定義で初期化されました)。updateメソッドの実装は次のとおりです。

private void update(int feedid) throws PachubeException, IOException ,Exception
{

    Feed f = this.pachube.getFeed(feedid);

    System.out.println("updating ...");

    f.updateDatastream(8345, (double) val);
    f.updateDatastream(6274, (double) val);
    f.updateDatastream(1044, (double) val);
    //   f.updateDatainputDatastream((f.getData(), in, out, true));
    //System.out.println(val);    
    System.out.println("updated");
}
4

1 に答える 1

1

この問題の答えは自分で見つけました。serialEvent メソッドの署名にある同期指定子により、他のスレッドが val 変数にアクセスできなくなりました。私はそれを削除しましたが、現在は完全に機能しています。

于 2013-04-11T06:52:16.493 に答える