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

블루투스 쓰레드 질문 드립니다. read

0 추천

블루투스에서 첫번째 데이터와 나머지데이터가 따로 들어와서 

다음과 같이 해결을 했는데요. 데이터가 10byte만들어와서요 최소 20byte가 들어와야하는데 어떻게 해야할까요?

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

            int check_bytes = 0;
            byte[] buffer_b = new byte[1024];
            
            // Keep listening to the InputStream while connected
            while (true) {
                try {
                    // Read from the InputStream
                    bytes = mmInStream.read(buffer);
                    if(bytes == 1)
                    {
                    	//buffer_b 에 buffer 를 1byte copy
                        System.arraycopy(buffer, 0, buffer_b, 0, 1);
                    	check_bytes = 1;
                    }
                    else
                    {
                    	if(check_bytes==1)
                    	{
                    		//buffer_b에 buffer를 붙이고 bytes+1 해서 보냄
                    		System.arraycopy(buffer, 0, buffer_b, 1, bytes); 
                            mHandler.obtainMessage(Sensor_mode.MESSAGE_READ, bytes+1, -1, buffer_b)
                            .sendToTarget();
                    		check_bytes=0;
                    	
                    	}else
                    	{
                    		// Send the obtained bytes to the UI Activity
                            mHandler.obtainMessage(Sensor_mode.MESSAGE_READ, bytes, -1, buffer)
                                    .sendToTarget();                    		
                    	}
                    }
                } catch (IOException e) {
                    Log.e(TAG, "disconnected", e);
                    connectionLost();
                    break;
                }
            }
        }

 

 
와따까따뿌따 (180 포인트) 님이 2014년 6월 25일 질문

1개의 답변

0 추천
InputStream 으로 읽을 경우, 길이를 미리 아신다면 버퍼를 전역으로 하시고 읽은 값을 버퍼에 계속 쌓는식으로 수정을 하셔야겠네요.

 프로토콜 수정이 가능하시면 new line을 넣어서 BuffedInputStream에 readLine 함수를 사용하는 것도 방법이 될수 있습니다.
안_드루이드 (14,510 포인트) 님이 2014년 6월 25일 답변
BufferedReader br = new BufferedReader(mmInStream);
                String read;
                while((read = br.readLine()) != null){
                byte[] bufferCoordinate = read.getBytes();
                
이런 방법으로 바꾸어 보았지만 이건 데이터가 아예 안들어오더라구요.
readLine()의 경우 쓰는 쪽에서  데이타 마지막에 new line character를 써 줘야 문제없이 동작을 합니다.
  read(char[] buffer, int offset, int length) 함수를 사용해 보세요.
 보통 read의 경우 실제 읽은 바이트수가 됩니다.
원래 이런 현상이 있는건가요? 데이터를 받을때?. 해결하기 어렵네요 ㅠㅠ 초보라
리드라인으로는 이렇게 해서 보내는 쪽에서 RMC,123,345 을보내려고 하는데 이것도 안되네요.ㅠㅠ     

while((read = br.readLine()) != null){
                            char cha[] = read.toCharArray();
                            if(cha[0] == 'R'){
                                if(cha[1] == 'M'){
                                    if(cha[2] == 'C'){
                                        String[] string = read.split(",");
                                        String a = string[1];
                                        String b = string[2];
                                        String c = a+b;
                                       
                                byte[] bufferCoordinate = c.getBytes();
데이타가 읽혀지기는 하는건가요?
기본 소스로 하면 데이터가 잃어 지기는 합니다.
만약에 1234567890을 송신하면 어플에서
1
234567890 이렇게 두번 읽더라구요 채팅창에서 그리고
12345678905555 이렇게 10byte가 넘는 데이터를 보내면
앞에 10byte는 짤리고 5555만 뜨더라구요. 이곳저곳 찾아보니
앞에서 짤리는 데이터를 붙이는건 있는데 데이터량을 늘리는법은 없더라구요...
원래 대부분의 read 함수 라는 것이 그렇습니다.
 수신쪽에서는 송신쪽이 어떤 데이타를 보냈는지 알수가 없기때문에 서로 프로토콜이 필요한 것이지요.
 채팅인 경우이면 보통 write하는 쪽에서 "\r\n"을 넣어줄것 같은데, readLine()이 동작을 하지 않으면, read() 함수가 읽은 길이를 리턴하므로,
그값을 이용해서 이어붙여야 할 것 같네요.
안녕하세요 이어붙이기를 해서 첫번째 줄과 두번째 줄게 나오는걸 했어요.그리고 세번째 줄에 나오는걸 다시 붙이려고 하니 안되네요 아래 소스가
        if(bytes == 1)
                    {
                       
                       System.arraycopy(buffer, 0, buffer_b, 0, 1);
                        check_bytes = 1;
                    }
                    else
                    {
                        if(check_bytes==1)
                        {
                           
                            System.arraycopy(buffer, 0, buffer_b, 1, bytes);
                        
                        a_byte=1;
                        }
                         else
                        {
                            if(a_byte==1)
                        {
                                System.arraycopy(buffer_b, 0, buffer_c, 1, bytes);
                            mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer_c)
                               .sendToTarget();
                            a_byte=0;
                            }
                           
                            else{
아 그리고 제가 blueturn이라는 다른 어플소스 찾아서 실행해보았는데요
여기는 쓰레드부분이 똑같은데 데이터가 다 들어가더라구요.
그래서 더 혼란이에요 ㅠㅠ.
...