[Arduino] 명령어를 보내면 반응이 느릴 때 feat. readBytesUntil
'Serial.read()'로 읽어서 쓸 때는 이런 현상이 없습니다.
그런데 'Serial.readBytesUntil()'를 사용하여 데이터를 읽었더니 1초 정도 반응이 느린 듯한 느낌을 받았습니다.
아래 스크린샷을 보면 연속으로 명령을 보냈는데 묘하게 다음 요청의 응답이 오는데 1초가량의 텀이 있는 것 처럼 보입니다.
문제없는 스크린샷을 보면 좀 더 명확해집니다.
이건 각 명령어의 텀이 없습니다.
1. 원인
문서를 확인해 보았습니다.
arduino reference - Serial.readBytesUntil()
문서에 보니
1) 결정된 길이를 읽거나(지정된 버퍼를 채울 때까지)
2) 지정된 시간이 초과하거거나( Serial.setTimeout() )
3) 지정된 종결 문자가 올 때(함수별로 차이 있음)
했을 때 버퍼를 반환합니다.
그러니 'setTimeout'에 의해 설정된 시간이 없으면 1초를 대기합니다.
(기본값)
2. 해결 방법
간단한 해결 방법은 'Serial.setTimeout([시간])'을 사용하여 대기시간을 줄이는 것입니다.
//100밀리초로 설정
Serial.setTimeout(100);
당연히 설정된 시간 안에 보내온 데이터를 못 받을 가능성이 있으므로 여기에 대한 예외는 처리해야 합니다.
이것저것 어렵다 싶으면 시간을 늘리는 것도 답입니다.
Serial.setTimeout()를 따로 설정하지 않으면 1000밀리초가 설정됩니다.
(참고 : arduino reference - Serial.setTimeout() )
Serial.setTimeout()에 영향받는 명령어는
- Serial.find()
- Serial.findUntil()
- Serial.parseInt()
- Serial.parseFloat()
- Serial.readBytes()
- Serial.readBytesUntil()
- Serial.readString()
- Serial.readStringUntil()
입니다.
마무리
근본적인 해결책은 'Serial.read()'로 처리하는 게 맞습니다.
'Serial.read()'는 무조건 한 개씩 읽으므로 이런 문제가 발생하지 않죠.
대신 손이 많이 가므로 이런 'readBytesUntil'와 같은 기능을 사용하는 것입니다.
어느 쪽이 나을지는 자신이 선택해야 합니다.