반도체, 임베디드 Study/STM32

STM32 - UART 구현 - (2) (Echo, Polling 코드 상세 분석)

잇(IT) 2024. 5. 29. 19:11
728x90

https://insoobaik.tistory.com/614

 

STM32 - UART 구현 - (1)

보호되어 있는 글입니다. 내용을 보시려면 비밀번호를 입력하세요.

insoobaik.tistory.com


UART 통신은 기본적으로 8bit 데이터를 전송하기 때문에 char, uint8_t와 같이 8bit 이하 데이터 전송만 가능하다.


__io_putchar

 

__io_putchar는 printf문을 출력하기 위한 가장 기본적인 함수다.

putchar는 printf에 입력된 문자열의 문자 하나하나마다 함수가 실행된다.

 

Transmit() 함수를 이용하여 전달받은 ch값을 UART 통신을 통해 출력한다.


 

echo 모드

 

Uart의 echo 모드는 송신한 데이터를 수신 측에서 다시 그대로 송신 측으로 되돌려 보내는 모드를 의미한다.

uart가 전송할 수 있는 최대 bit인 8비트에 해당하는 char형 배열 buf를 생성하고 char형 문자열을 위와 같이 생성한다.

if문을 통해 USART3번을 통해 buf 문자열의 주소값이 전달되고, buf 사이즈 만큼 Receive (위에 buf 문자열이 초기화 되어있다.) 값을 수신한다.
(echo 모드에서는 반환 값이 올바르게 확인되지 않기 때문에 if문을 자연스럽게 통과하게 된다.)

 

값을 수신하게 되면 Transmit 함수를 통해 buf 문자열 주소를 전달하여 buf 문자열 크기만큼 송신하여 Console 창을 통해 확인할 수 있다.


Polling 모드

 

Polling 모드는 계속해서 CPU가 데이터를 송수신하기 위해 UART 주변장치의 상태를 주기적으로 확인하는 방식이다.

 

구성이 간단하지만 CPU 사용량이 증가하고, 실시간 처리 중 UART 데이터를 놓칠 수 있다.

 

HAL_UART_Receive 함수는 아래와 같이 선언되어 있다.

Receive 함수의 반환값은 HAL_ERROR, HAL_TIMEOUT, HAL_OK, HAL_BUSY 값이 반환되는 것을 확인할 수 있다.

 

4가지 값 중 HAL_OK 일 때를 구현할 것이다.

HAL_OK는 Receive 함수 조건에 맞게 값의 입력이 들어왔을 때를 확인하는 값이다.

HAL_UART_Receive(&huart3, (uint8_t *)buf, 1, 1000)

위 함수의 경우 USART3번을 통해 buf 버퍼에 1바이트의 크기의 입력이 1초안에 들어와야 HAL_OK 함수를 반환한다.

 

echo 모드일때와 코드는 동일하지만 if문 Receive 함수의 반환값이 HAL_OK와 동일할 때만 if문을 통과하도록 작성하였다.

Polling Mode의 경우 계속해서 UART 주변장치를 확인하기 위해 else를 통해 HAL_OK가 아닐 경우 TIME OUT을 출력하도록 한다.

같은 코드이지만 Receive 파라미터의 값을 위와 같이 변경하게 되면 3개의 값이 5초안에 들어오게 되면 HAL_OK를 반환하고 그게 아니라면 if문을 충족 시키지 못하고 TIME OUT를 출력한다.

(또 2개까지만 입력이 들어오고 3개째 입력이 오지 않고 5초가 지나면 TIME OUT을 출력한다.)

728x90