문자열을 비교했을 때 분명 같은 단어인데 같은 문자가 아니라는 결과물이 나올 수도 있다.
다른 쓰레기값이 들어있을 수도 있지만 보통 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)
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만 사용하고 있다.
'프로그래밍' 카테고리의 다른 글
[C# .NET] 최소, 최대, 닫기 버튼 없애기 (0) | 2022.06.30 |
---|---|
[C#.NET] 상단 메뉴 만들기 (0) | 2022.06.30 |
[Linux] GREP (feat. 특정 단어를 특정 파일에서 찾기) (0) | 2022.06.03 |
[Git] git 커밋 제외 파일만들기 (.gitignore+.env) (0) | 2022.05.13 |
[AVR] dep/main.o.d: No such file or directory 에러 (0) | 2022.02.07 |
댓글