프로그래밍/하드웨어

[Arduino] 명령어를 보내면 반응이 느릴 때 feat. readBytesUntil

당근천국 2023. 6. 24. 15:30

'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'와 같은 기능을 사용하는 것입니다.

어느 쪽이 나을지는 자신이 선택해야 합니다.