0

シリアル ポートから受信したデータを、別のクラスでアクセスされる文字列変数に格納したいと考えています。COM ポートから受信したデータを出力するコードを作成しましたが、メソッドから変数にアクセスすると、null..助けてください..これには RxTx ライブラリを使用しています。

public class ProtocolImpl implements Protocol {  

    byte[] buffer = new byte[1024];  
    int tail = 0;  
    public String message;

    public void onReceive(byte b) {  
        // simple protocol: each message ends with new line  
        if (b=='\n') {  
            onMessage();  
        } else {  
            buffer[tail] = b;  
            tail++;  
        }  
    }  

    public void onStreamClosed() {  
        onMessage();  
    }  

    /* 
     * When message is recognized onMessage is invoked  
     */  
    private void onMessage() {  
        if (tail!=0) 
        {  
            // constructing message  
            message = getMessage(buffer, tail);  
            //rmess = message;
            System.out.println("RECEIVED MESSAGE: " + message);  

            if ("KITM".equalsIgnoreCase(message)) {  
                CommPortSender.send(getMessage("OK"));  
            } 
            tail = 0;  
        }  
    }  

    public String rmess() /*this method is returning null.. please help me out*/
    {
        if (tail!=0) {  
        message = getMessage(buffer, tail); 
        }
        return message;
    }

    // helper methods   
    public byte[] getMessage(String message) {  
        return (message).getBytes();  
    }  

    public String getMessage(byte[] buffer, int len) {  
        return new String(buffer, 0, tail);  
    }  
}
4

2 に答える 2

1

インスタンス変数 を使用していますmessage。オブジェクトごとに、この変数のインスタンスが 1 つありProtocolImplます。おそらく、が呼び出されるProtocolImplオブジェクトonMessageは、 が呼び出される別のProtocolImplオブジェクトrmessです。

簡単な修正はmessage静的変数を作成して、プログラム全体でその変数のインスタンスが 1 つだけになるようにすることです。ただし、これにより、同期やオブジェクトの独立性などの微妙な問題が発生する可能性があることに注意してください。より良い解決策は、同じオブジェクトを使用して と の両方を呼び出していることを確認することProtocolImplです。onMessagermess

于 2012-07-24T20:37:34.717 に答える
0

メッセージ オブジェクトがシリアル化されていないため、メッセージが null になっています。java.io.Serializable を実装できます

于 2012-07-25T06:55:08.943 に答える