안드로이드 스튜디오 java 배열 저장

조회수 47회
public void handleMessage(android.os.Message msg){
                Timer buttonTimer = new Timer();

                if(msg.what == BT_MESSAGE_READ){
                    String readMessage = null;
                        try {
                        readMessage = new String((byte[]) msg.obj, "UTF-8");
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }

                    String[] readMessage1;
                    String[] array_word = new String[64];
                    readMessage1 = readMessage.split("");
                    int j;

                    for(int i=0;i<readMessage1.length;) {
                        if(readMessage1[i]=="7") {
                            i++;
                        }
                        j=0;
                        array_word[j]=readMessage1[i];
                        j++;
                        i++;
                    }
    ~~후략~~

readMessage라는 String 변수로 아두이노에서 보내져온 64개의 값을 분리하는 소스를 만드려고 합니다.

시작과 끝을 모르기 때문에 아두이노에서 임의로 시작할 때 '7'을, 끝난 이후에는 '5'를 보냅니다. 즉, 7과 5 사이에는 64개의 1과 0으로 이루어진 값이 존재하는 것이죠. 그건 고정입니다.

이를 판단하기 위해서 readMessage1이라는 배열을 만들어서 readMessage를 먼저 찢었습니다.

그리고 array_word라는 배열을 만들고 readMessage1에서 먼저 i값을 증가시켜서 7을 찾습니다. 7을 찾았다면 바로 i값을 1 증가시키고 그 값을 array_word[0]부터 넣는 함수를 만드려고 합니다.

하지만 저렇게 하니까 튕기더군요....

조언 부탁드립니다.

1 답변

  • 주의: 임베디드와 통신 할 때에는 데이터가 한번에 오지 않는경우를 산정해야합니다.

    시작바이트 + 끝점바이트 + 64개의 데이터, 즉 66개의 바이트가 한번에 오지 않고 2번, 3번에 나눠서 올 수 있습니다.

        List<Byte> readMessageFromAduino = new ArrayList<>();
        private static final byte START_OF_FRAME = '7';
        private static final byte END_OF_FRAME = '5';
    
        @Nullable
        public List<Byte> parseByteArr(byte[] inputData){
            List<Byte> parsingByteData = new ArrayList<>();
            int startOfFrameIndex = -1;
    
            for (byte b : inputData) {
                // 들어온 데이터를 한 곳에 합침.
                readMessageFromAduino.add(b);
            }
    
            if (readMessageFromAduino.size() < 66) {
                // 데이터가 충분히 모이지 않음.
                return null;
            }
    
            for(int i = 0; i < readMessageFromAduino.size(); i++) {
                if (readMessageFromAduino.get(i) == START_OF_FRAME) {
                    // StartOfFrame(SOF) 을 검색함.
                    startOfFrameIndex = i;
                    break;
                }
            }
    
            if (startOfFrameIndex == -1) {
                // SOF 찾을 수 없음
                return null;
            }
    
            if (readMessageFromAduino.size() < startOfFrameIndex + 66) {
                // SOF 에서 EOF 까지 데이터가 전부 모이지 않음.
                return null;
            }
    
            if (readMessageFromAduino.get(startOfFrameIndex + 65) != END_OF_FRAME) {
                // 충분한 데이터 갯수가 모이고 SOF 도 검출됐지만 EOF 가 나오질 않음
                // 디버깅 필요, 현재 readMessageFromAduino 리스트에 추가 조치 필요
                // log(readMessageFromAduino)
                return null;
            }
    
            // 모든 데이터 검증 완료 //
    
            for (int i = 0; i < 64; i++) {
                // 데이터 복제
                parsingByteData.add(readMessageFromAduino.get(i + startOfFrameIndex + 1));
            }
    
            // 복제된 데이터 삭제
            readMessageFromAduino.removeAll(parsingByteData);
    
            return parsingByteData;
        }
    
        // 이렇게 사용하세요
        public void handleMessage(android.os.Message msg){
                    Timer buttonTimer = new Timer();
                    List<Byte> parsedByteArr = parseByteArr(msg.obj);
                    if (parsedByteArr != null) {
                        // Validated data is available.
    
                    }
        }
        ~~후략~~
    
    

    추가적으로

    • readMessage, readMessage1 변수명은 읽는 사람에게 너무 가혹합니다.
    • 다음번엔 튕기는 곳이 어딘지, 에러메세지는 뭐가 나오는지도 질문에 같이 넣어주시기 바랍니다.
    • 에러는 나지 않습니다. 앱이 그냥 튕깁니다.... 감자마늘양파 2019.11.5 11:05
    • 앱이 튕긴 다음에 로그캣 부분에 [Show only selected application] 을 [No filters] 로 바꾸시고 에러 메세지를 확인해보세요 김은기 2019.11.5 13:09
    • 그냥 대충 살펴봤을 때 for문에서 index 에러가 발생할 것 같네요. 왜 for문에서 강제로 i++을 하시는거죠. 뉴랜드 2019.11.7 17:45

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.