안드로이드 스튜디오 java 배열 저장
조회수 1408회
public void handleMessage(android.os.Message msg){
Timer buttonTimer = new Timer();
if(msg.what == BT_MESSAGE_READ){
String readMessage = null;
try {
readMessage = new String((byte[]) msg.obj, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String[] readMessage1;
String[] array_word = new String[64];
readMessage1 = readMessage.split("");
int j;
for(int i=0;i<readMessage1.length;) {
if(readMessage1[i]=="7") {
i++;
}
j=0;
array_word[j]=readMessage1[i];
j++;
i++;
}
~~후략~~
readMessage라는 String 변수로 아두이노에서 보내져온 64개의 값을 분리하는 소스를 만드려고 합니다.
시작과 끝을 모르기 때문에 아두이노에서 임의로 시작할 때 '7'을, 끝난 이후에는 '5'를 보냅니다. 즉, 7과 5 사이에는 64개의 1과 0으로 이루어진 값이 존재하는 것이죠. 그건 고정입니다.
이를 판단하기 위해서 readMessage1이라는 배열을 만들어서 readMessage를 먼저 찢었습니다.
그리고 array_word라는 배열을 만들고 readMessage1에서 먼저 i값을 증가시켜서 7을 찾습니다. 7을 찾았다면 바로 i값을 1 증가시키고 그 값을 array_word[0]부터 넣는 함수를 만드려고 합니다.
하지만 저렇게 하니까 튕기더군요....
조언 부탁드립니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
주의: 임베디드와 통신 할 때에는 데이터가 한번에 오지 않는경우를 산정해야합니다.
시작바이트 + 끝점바이트 + 64개의 데이터, 즉 66개의 바이트가 한번에 오지 않고 2번, 3번에 나눠서 올 수 있습니다.
List<Byte> readMessageFromAduino = new ArrayList<>(); private static final byte START_OF_FRAME = '7'; private static final byte END_OF_FRAME = '5'; @Nullable public List<Byte> parseByteArr(byte[] inputData){ List<Byte> parsingByteData = new ArrayList<>(); int startOfFrameIndex = -1; for (byte b : inputData) { // 들어온 데이터를 한 곳에 합침. readMessageFromAduino.add(b); } if (readMessageFromAduino.size() < 66) { // 데이터가 충분히 모이지 않음. return null; } for(int i = 0; i < readMessageFromAduino.size(); i++) { if (readMessageFromAduino.get(i) == START_OF_FRAME) { // StartOfFrame(SOF) 을 검색함. startOfFrameIndex = i; break; } } if (startOfFrameIndex == -1) { // SOF 찾을 수 없음 return null; } if (readMessageFromAduino.size() < startOfFrameIndex + 66) { // SOF 에서 EOF 까지 데이터가 전부 모이지 않음. return null; } if (readMessageFromAduino.get(startOfFrameIndex + 65) != END_OF_FRAME) { // 충분한 데이터 갯수가 모이고 SOF 도 검출됐지만 EOF 가 나오질 않음 // 디버깅 필요, 현재 readMessageFromAduino 리스트에 추가 조치 필요 // log(readMessageFromAduino) return null; } // 모든 데이터 검증 완료 // for (int i = 0; i < 64; i++) { // 데이터 복제 parsingByteData.add(readMessageFromAduino.get(i + startOfFrameIndex + 1)); } // 복제된 데이터 삭제 readMessageFromAduino.removeAll(parsingByteData); return parsingByteData; }
// 이렇게 사용하세요 public void handleMessage(android.os.Message msg){ Timer buttonTimer = new Timer(); List<Byte> parsedByteArr = parseByteArr(msg.obj); if (parsedByteArr != null) { // Validated data is available. } } ~~후략~~
추가적으로
- readMessage, readMessage1 변수명은 읽는 사람에게 너무 가혹합니다.
- 다음번엔 튕기는 곳이 어딘지, 에러메세지는 뭐가 나오는지도 질문에 같이 넣어주시기 바랍니다.
- 에러는 나지 않습니다. 앱이 그냥 튕깁니다.... 알 수 없는 사용자 2019.11.5 11:05
- 앱이 튕긴 다음에 로그캣 부분에 [Show only selected application] 을 [No filters] 로 바꾸시고 에러 메세지를 확인해보세요 김은기 2019.11.5 13:09
- 그냥 대충 살펴봤을 때 for문에서 index 에러가 발생할 것 같네요. 왜 for문에서 강제로 i++을 하시는거죠. 주동혁 2019.11.7 17:45
- readMessage, readMessage1 변수명은 읽는 사람에게 너무 가혹합니다.
댓글 입력