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

블루투스 통신시 데이터 받을 때 한글자씩 받아오기

0 추천

안녕하세요 블루투스 기기(MCU, STM32) 로부터 데이터를 받아오는 안드로이드 어플을 만들고 있습니다

안드로이드를 건드려본지는 몇일이 채 안된 초보이구요

 

기기에서 'A000000F' 모양의 메세지를 블루투스로 안드로이드에게 보냅니다

한번 전송할때 글자수는 일정한 9 글자 입니다.

A는 시작 문자 , F는 종료 문자입니다.

데이터가 오긴 하는데 MCU의 한계인지, 블루투스의 한계인지

inputstream을 통해 데이터를 받아오는데 한번에 완성된 문자열이 오지 않고 끊어서 옵니다

 

가령 A0101001F 라는 문자를 기기에서 안드로이드로 보내고자 할때

bytes = inputStream.read(buffer);

이것을 스레드를 이용해서 루프하는 방식으로 받아옵니다 (BTchat의 예시에서 따왔습니다)

그렇게하여 byte를 스트링으로 변환하여 로그를 찍어보면

루프1회 ) A

2회) 0101001F

이런식으로 데이터가 들어옵니다

 

그래서 제생각에는 이러한 인풋스트림을 루프 기준으로 끊어서 저장하는 것이 아니라

오는것을 오는 대로 저장하되, 끝내는 문자인 F를 받으면 그때 inputstream을 끊어서 저장하고자 했습니다

 

그래서 이것을 구현하기 위해서...

 

인풋스트림을 받아오는 스레드 클래스 내에 char splitWord[30]를 new로 생성하고

받아오는 byte를 스트링으로 변환 후 한글자씩 받아오면서

'F'가 나오면 받는 것을 그만두게끔 해봤습니다

 

 

스레드 클래스에는

char splitWord[30]

int i=0

int flag = 0

이 정의되어있습니다

while(true){

    try {

        bytes = inputStream.read(buffer);
        //인풋스트림에서 받은 byte를 string으로 변환하여 tempMsg 저장
        String tempMsg = new String(buffer,0,bytes);
        //length는 i + 받아온 텍스트 길이만큼
        length = tempMsg.length() + i;


        //splitWord에 데이터를 한글자씩 복사하면서 'F'가 있으면 멈추기
        while(true){
            if(i<length) break;

            splitWord[i] = tempMsg.charAt(i);
            if(splitWord[i] == 'F') {flag = 1; break; }

            i++;

        }

        if(flag == 1) break;
    }

하지만 로그를 찍어보니

 

i와 length가 매 루프마다 0으로 초기화되어서 진행이 되는 것 같습니다

그렇기 때문에 wordSplit에는 데이터가 누적되어서 저장되지 않구요..

왜 그런 걸까요?

이것을 해결하거나, 더 적절한 방법이 있을까요?

 

 

코두 (370 포인트) 님이 2019년 1월 23일 질문

답변 달기

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