2012-07-24 4 views
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); 
    } 
} 
+0

"메소드 밖"변수에 'null'을 반환하는 방법에 코드를 추가 할 수 있습니까? 또는 게시 된 코드의 어떤 부분이 이것을 수행하는 부분인지 나타낼 수 있습니까? –

+0

rmess() 메서드가 onmessage() 내부에서 호출 된 경우 : onMessage() { ........... .......... System.out.println "받은 메시지 :"+ 메시지); System.out.println (rmess()); ....... ....... } 여기서 수신 된 메시지의 값을 반환합니다. 두 행 모두 동일한 출력을 제공하지만 (명백하게)이 클래스에서 rmess() 메서드가 호출되면 그것은 null을 반환합니다 .. – Manu

답변

1

message입니다. 각 ProtocolImpl 오브젝트에 대해이 변수의 인스턴스가 하나 있습니다. 아마도 개체는 onMessage이 호출되어 rmess이라는 다른 ProtocolImpl 개체입니다.

쉬운 수정은 messagestatic variable으로 만들어 전체 프로그램에서 해당 변수의 인스턴스가 하나만 있도록하는 것입니다. 하지만 동기화와 개체 독립성과 같은 미묘한 문제가 발생할 수 있습니다. 더 좋은 해결책은 동일한 ProtocolImpl 개체를 사용하여 onMessagermess을 모두 호출하는 것입니다.

+0

나는 rmess() 메소드를 사용하고 싶지 않습니다. 클래스의 변수를 사용할 수 있도록 문자열에서 수신 된 메시지의 값을 얻으려고하고 있습니다 .. SOP 줄에 onMessage() 메서드는받은 메시지를 인쇄하고 있지만이 반환 형식 메서드를 만들었으므로 catch 할 수 없습니다. 그러나 이것은 실패했습니다. Lemme 메시지 변수를 정적으로 확인하여 코드를 확인하십시오 .. – Manu

+0

Keith Randall >> heyy 고마워 친구, 내가 정적 메시지 변수를 만들었 .. 그리고 그것은 .. 덕분에 많이 ... 왜 내 마음에 왔어 전에 : P는 – Manu

0

메시지 객체가 직렬화되지 않아 메시지가 null이됩니다. java.io.Serializable을 구현할 수 있습니다.

관련 문제