마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 블루투스 통신 데이터 수신 질문이요

0 추천

블루투스 채팅 예제를 베이스로 사용하고 있는데요

블루투스를 통해서 센서 값을 보내고 받고 있는데요

받는 값을 화면에 띄워주고 있는데 같은 값이 또 나오거나 합쳐져서 나오는 경우가 있습니다.

예를 들어서

60.30186 roll

21.151842 pitch   이렇게 두줄이 나와야 정상인데

-4.431724 pitc

-4.431724 pitch 이나

-1.342653 pit

-1.342653 pitch 또는

-1.342653 p

-1.342653 pitch 이런식으로 나올때가 있습니다.

먼저 구글링을 해봤는데 가장 그럴듯한 설명을 찾아봤는데 아래와 같은 설명입니다.

public void run() {
            Log.i(TAG, "BEGIN mConnectedThread");
            byte[] buffer = new byte[1024];
            int bytes;

            // Keep listening to the InputStream while connected
            while (true) {
                try {
                    // Read from the InputStream
                    bytes = mmInStream.read(buffer);

                    // Send the obtained bytes to the UI Activity
                    mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer)
                            .sendToTarget();
                } catch (IOException e) {
                    Log.e(TAG, "disconnected", e);
                    connectionLost();
                    break;
                }
            }
        }

아마도 원흉은 바로 이 구문에 있을 듯 합니다. 데이타를 읽을 때, 공용 buffer 를 사용하고 있거든요.

sendToTarget() 메서드는 Async 스타일에, 메세지 큐에 메세지를 던져 놓고 바로 리턴됩니다.

그리고 해당 메세지는 메세지 큐에 들어간 후, 

일정 시간이 지나 자기 차례가 온 순간에야 처리(여기서는 GUI 에 업데이트)됩니다. 

그런데 여기서 잠깐...

그전에 소켓 상에서 또다른 read 가 일어나면 어떤 일이 될까요;;;

네... 이전에 날아간 메세지도, 그리고 새롭게 날아갈 메세지도 모두 동일한 buffer 를 참조

하고 있기 때문에, 이전에 전달한 메세지가 아예 유실되거나, 새로운 메세지와 겹쳐져서 출력될 

수 있습니다. 

- 여기까지 -

 

이 설명이 맞는지 그리고 이 설명이 맞다면  이 부분의 어디를 어떻게 수정해야 할지 모르겠습니다.

도와주세요 부탁드려요

 

st3419 (120 포인트) 님이 2016년 2월 2일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...