안드로이드 스튜디오 블루투스 수신 Handler로 데이터 수신시에 데이터가 사라져요

조회수 5298회

안드로이드 스튜디오로 블루투스 데이터 송수신 연습하고 있는데요 아두이노에 HC-06를 연결하고 블루투스 스마트폰 앱을 제작하였습니다.

스마트폰 센서의 값을 보내주고 다시 되돌려 받으려고 합니다. 그러다 스마트폰에서 보내는건 정상적으로 작동하는데 받아지는 부분이 잘안되어서 시리얼모니터로 값입력한 것을 보내주는 코드를 썻습니다. 아두이노 시리얼 모니터 받은 값을 그대로 다시 스마트폰으로 보내는 코드를 짯고 페어링 부분은 되었고 데이터도 일정데이터 받아지는데요

문제는 만약 <123,456>을 시리얼모니터로 입력해서 보냈다면, 스마트폰에 표시되는 값은 <23,456> 으로 받아지고 있습니다. 한두번씩 정상적인 값이 받아지기도 합니다. 또 <10,10>을 입력해서 보내는 경우는 가끔씩 <0,10>>> 이런식으로 나오기도 하구요.. 뭐가문제일까요...?

#아두이노코드
#include <SoftwareSerial.h>
SoftwareSerial btSerial(5,6); //RX, TX

void setup() {
  Serial.begin(9600);
  btSerial.begin(9600);
}

void loop() {
    if(Serial.available()) {
    btSerial.write(Serial.read());        
    }

    if(btSerial.available()) {
   Serial.write(btSerial.read());
      }
}

이렇게 작성하고 시리얼 모니터를 통해 를 직접 입력해서 스마트폰으로 보냅니다.

//안드로이드 스튜디오 핸들러부분, 블루투스 스레드부분

    public Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            if (msg.what == handlerState) {
                String readMessage = (String) msg.obj;
                recDataString.append(readMessage);

                int endOflineIndex = recDataString.indexOf(">");

                if (endOflineIndex > 0) {
                    if (flag == 1) {  //flag=0이면 아두이노로 보내뒤 flag=1로 만들고 기다림
                            Log.d(Tag, String.valueOf(recDataString));
                            textview.setText("받아진값 : " + readMessage); 
                        }
                            recDataString.delete(1, recDataString.length()+1);
                            flagg = 0;

                    }
                }

            }
        }

    };

  ... 중략

private class ConnectedThread extends Thread {
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;

        ConnectedThread(BluetoothSocket socket) {
            InputStream tmpIn = null;
            OutputStream tmpOut = null;
            try {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException ignored) {
            }
            mmInStream = tmpIn;
            mmOutStream = tmpOut;
        }

        public void run() {
            byte[] buffer = new byte[1024];
            int bytes; // bytes returned from read()
            // keep listening to the InputStream untill an exception occurs
            while (true) {
                try {
                    // Read from the Inputstream
                    bytes = mmInStream.read(buffer);
                    final String readingMessage = new String(buffer, "US-ASCII");
                    mHandler.obtainMessage(handlerState, bytes, -1, readingMessage).sendToTarget();
                } catch (IOException e) {
                    e.printStackTrace();
                    break;
                }
            }
        }

    ...중략

    }

  • (•́ ✖ •̀)
    알 수 없는 사용자

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

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)