프로그래밍

문자열 불일치 에러(feat. CR/LF)

Beginner:) 2022. 6. 3.
320x100

문자열을 비교했을 때 분명 같은 단어인데 같은 문자가 아니라는 결과물이 나올 수도 있다.

 

다른 쓰레기값이 들어있을 수도 있지만 보통 CR/LF 관련이 많을 것이다.

 

CR/LF란 CR(Carriage Return : \r) + LF(Line Feed : \n)로

 

CR은 현재 커서를 가장 앞으로 옮기는 행동,

LF는 줄을 바꾸는 행동이다. 

 

좀 더 자세히 예를들어 본다. 

아두이노로 예를 들지만 어느 언어든 발생할 수 있다.


현재 아두이노와 아두이노를 통신을 하고 있다. data값이 true면 ON, false면 OFF를 보내고 있다. 

if( data == true) {
  Serial2.println("ON");
}
else {
  Serial2.println("OFF");
}

 

데이터를 받는 아두이노 코드이다.

if (Serial1.available()){
    String data = Serial1.readString();
    Serial.println(data);
    if(data.equals("ON")){
        Serial.println("일치");
    }
    else{
        Serial.println("불일치");
    }
}

 

"ON"이라는 데이터를 보내본다.

"ON"이라는 데이터를 보냈고 "ON".equls("ON")이지만 불일치라는 결과가 나왔다.

 

한줄이 띄워져 나왔으니 \n을 하면 될까 ? 

 

아래와 같이 코드를 수정해보고 실행을 해보면 마찬가지고 불일치가 나타난다. 

if(data.equals("ON\n")){
    Serial.println("일치");
}

 

수신된 데이터를 모두 아스키코드로 바꿔보자.

(아스키코드표는 아래의 링크에 첨부되어있다)

 

2020.12.30 - [기타] - 아스키코드표 (ASCII)

 

아스키코드표 (ASCII)

아스키 코드표입니다. 통신용으로 보기 편하게 10진수, 16진수, 문자표 매칭입니다. 이외는 엑셀파일과 텍스트 파일 첨부하니 엑셀의 경우 열을 숨겨서 보시면 편합니다. (sheet 2개입니다.)

park-duck.tistory.com

 

ON의 데이터이다. (중간의 4는 데이터 크기이다)

79 = 'O'

78 = 'N'

13 = '\r'

10 = '\n'

OFF의 데이터이다. (중간의 5는 데이터 크기이다)

79 = 'O'

70 = 'F'

70 = 'F'

13 = '\r'

10 = '\n'

 

그렇다면 "ON\r\n"으로 비교해보자.

if(data.equals("ON\r\n")){
    Serial.println("일치");
}

"일치"라는 데이터가 나왔다. 

 

애초에 Serial 통신으로 데이터를 보낼때 Serial.println이 아닌 Serail.print로 보냈으면 에러는 없었을 것이다.

 

이외에도 우리눈에 보이지 않는 불필요한 데이터가 딸려들어와서 오류가 날수도 있다.

 

그러나 파일데이터, 통신으로 데이터를 보낼 때 한 번 쯤 만날 에러니 알아두는 것이 좋다.


참고로  마이크로소프트는 CRLF(\r\n)를 쓴다.

 

당장 메모장만 봐도 CRLF를 쓰는 것을 볼 수 있다.

 

 

리눅스에서는 \n만 사용하고 있다. 

 

 

반응형

댓글