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

블루투스 통신으로 타 센서의 데이터를 수신 시 문자열이 자동으로 2줄로 잘라집니다

0 추천
블루투스 통신으로 타 센서의 데이터를 수신 시 문자열이 자동으로 2줄로 잘라집니다
 
블루투스 통신으로 온도 센서 보드의 온도 데이터를 불러드리고 있습니다.
블루투스 소스는 안드로이드에서 제공하는 일반적인 채팅 예제 소스입니다.
 
단순히 serial 통신으로 문자열 송수신은 정상적으로 가능한데 
문제는 온도 센서의 데이터를 불러 들이면 두 줄로 나눠지게 됩니다.
 
예를들어 데이터의 값이 25.2, 26.3, 27.2 .... 이런식으로 들어온다고 가정할 때
 
SLAVE2: 2
SLAVE2: 5.2
SLAVE2: 2
SLAVE2: 6.3
SLAVE2: 2
SLAVE2: 7.2
 
이런식인데요. 이상한건 무조건 저런 식으로 들어오는 것은 아니고 가끔은
정상적으로 25.2 이렇게 들어오는 경우도 있습니다. 약 15~20번 중 한 번정도로요
 
무슨 문제인지 감이 오지 않습니다.
 
case MESSAGE_READ:
byte[] readBuf = (byte[]) msg.obj;
String readMessage = new String(readBuf, 0, msg.arg1);
mConversationArrayAdapter.add(mConnectedDeviceName+":  " + readMessage + " test "+ msg.arg1);
 
이 부분과
 
while (true) {
try {
bytes = mmInStream.read(buffer);
mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer).sendToTarget();
 
이 부분을 중점적으로 보는데 어느 부분을 수정해야 할까요?
하루만가능 (120 포인트) 님이 2014년 11월 28일 질문

1개의 답변

+1 추천
데이터를 수신할때에

그냥 읽은 바이트를 잘 읽어왔다고 치고 바로 처리하면 안되요..

예를들어서 보내는쪽이

1234567 을보낼것인데 한번에 1234567을 보낼수도 잇고  12 보내다가 순간적으로 쉬고 34567를 보낼수도 있거든요

그렇기 때문에 문자열의 실제 끝을 찾아야해요

보통 프로토콜이라해서 STX DATA EXT 이런식으로 하던 마지막에 CR을 붙혀서 하던 문자열의 끝을 만날때까지

버퍼에 쌓아둔후에 SPLIT 해야합니다

 

12 가들어왔다고 바로 데이터 처리하지말구 34567 [CR] 이런식으로 마지막에 CR이 들어온걸 체크한다던가..

해서 1234567 [CR] 까지 들고가서 데이터 처리해야 합니다

 

그러면 문제가 모두 해결이 되요...

그리고 순환식 큐로 만드시면 되요

 

순환식 큐 버퍼는 인터넷에 찾아보시면 나옵니다

** 한마디로 두줄로 들어오는게  아니고

받는 수신 타임이 적어서 반만 읽은온 거에요

그런후에 다시 루프에서 또 읽으니 나머지 반이 온거구...

데이터 끝 체크를 안해서 발생하는 문제...

(통신 초보이신분들이 보통 격는 문제...)

 ** 만약 끝을 알수는 없으니 00.0 이렇게 3개가 고정이라면 . 을 찾아서 1바이트 버리고 시작으로 해서 3바이트씩

읽어버리면 해결은 되겠으나.. 이것도 좋은방법은 아니고.. 가장 손쉬는 방법은 데이터 끝마다 CR을 보내서

읽을때에 CR(OR LF)을 만날때 까지 읽으면 해결이되겠지요

00.0[CR]00.0[CR]

더 도움이 필요하면 doridori2013@nate.com (네이트온 또는 메일)...
익명사용자 님이 2014년 11월 29일 답변
2014년 11월 29일 수정
데이터를 그쪽에서 보낼때 [CR]이라는 데이터를 붙여서 보내라는 말씀인가요??
...