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

bluetoothchat 예제관련 질문드립니다.

0 추천

현제 atmega128을 이용하여 공부중에 있는 학생인데요

하고있는것은 atmega128에 블루투스 모듈을 달고 휴대폰에 bluetoothchat 어플을 어느정도 고쳐서 atmega128의 온습도 센서의 온도값을 휴대폰으로 전송해주고, 휴대폰에서 버튼 클릭시 atmega에서 받아들여 몇가지 동작을 구현하는것을 하고있습니다.

휴대폰에서 atmega128로 데이터 전송후 원하는대로 작동은 하고있으나 문제점은atmega128에서 데이터값을 휴대폰으로 전송시 값이 재대로 들어오지를 않습니다.

atmega128 avrstudio 부분 소스의 일부입니다.

(TEMP_val이라는 변수에 온습도센서의 센서값이 들어가고 tp라는 변수의 값과 비교하여 값이 다르면 휴대폰으로 데이터 전송을 해주게됩니다)

void Tx_char(char d) { while(!(UCSR0A&0x20)); UDR0=d; }

void Tx_str(char *s) { while(*s)Tx_char(*s++); }

int main(void)

{

  ----- 중간생략-----

   while(1) {

  if(tp != TEMP_val)
  {

  sprintf(temp,"%2d",TEMP_val);
   Tx_str(temp);
   tp = TEMP_val;
  }   
 }

휴대폰으로 들어오는 결과는

이렇게 나오고있습니다.. 두자리 숫자가 연속으로 들어와야하나 끊어져서 들어오고있는데요..

bluetoothchat어플쪽 MainActivity.java 부분에서의 핸들러부분 소스입니다.

    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case MESSAGE_STATE_CHANGE:

  ----------중간생략------ 

         case MESSAGE_WRITE:

  ----------중간생략------

            case MESSAGE_READ:
                byte[] readBuf = (byte[]) msg.obj;
                String readMessage = new String(readBuf, 0, msg.arg1);
                mConversationArrayAdapter.add("현재온도 :  " + readMessage);
                break;
            case MESSAGE_DEVICE_NAME:
  ----------중간생략------
            case MESSAGE_TOAST:
  ----------중간생략------
            }
        }
    };

BluetoothChatService.java 부분의 소스입니다.   

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

        public ConnectedThread(BluetoothSocket socket, String socketType) {
            Log.d(TAG, "create ConnectedThread: " + socketType);
            mmSocket = socket;
            InputStream tmpIn = null;
            OutputStream tmpOut = null;

            try {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) {
                Log.e(TAG, "temp sockets not created", e);
            }

            mmInStream = tmpIn;
            mmOutStream = tmpOut;
        }

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

            while (true) {
                try {
                    bytes = mmInStream.read(buffer);
                    mHandler.obtainMessage(MainActivity.MESSAGE_READ, bytes, -1, buffer)
                            .sendToTarget();
                    
                } catch (IOException e) {
                    Log.e(TAG, "disconnected", e);
                    connectionLost();
                    BluetoothChatService.this.start();
                    break;
                }
            }
        }

 

어플쪽에서 문제를 해결해야 할것같은데... 좀 많이 모르다보니 엄청 해매고있네요 ^^;

도움 부탁드리겠습니다..

익명사용자 님이 2015년 7월 8일 질문

1개의 답변

0 추천
흠..

보내는쪽에서도 어차피 바이트배열로 보내는데 2자리수만 보내시는듯 하니

1 byte에 실어서 보내실것 같고..

 

case MESSAGE_READ: 부분에서 String로 변환하는 부분을

String.format("%d", readBuf[인덱스]);

 

이렇게 해보는건 어떨지.. 별 상관없을것 같긴 한데요

 

또 핸들러로 들어오기전 mmInStream.read(buffer);

부분의 buffer 를 프린트 해보는걸 먼저 해봐야 할듯 하기도 해요. 들어오는 데이터 그냥 %x로 프린트 해서

값이 제대로 들어오는지 확인부터 ..
아시리 (8,400 포인트) 님이 2015년 7월 8일 답변
...