TouchGFX Designer로 프로젝트를 생성해서 사용하면 int __io_putchar(int ch)을 추가하여도 printf 문이 동작하지 않습니다.
대부분 저는 인터넷에서 아래 함수를 복사해서 사용하는데 아무리 추가를 하여도 printf 문이 동작하지 않습니다.
#ifdef __GNUC__ | |
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) | |
#else | |
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) | |
#endif /* __GNUC__ */ | |
/** | |
* @brief Retargets the C library printf function to the USART. | |
* @param None | |
* @retval None | |
*/ | |
PUTCHAR_PROTOTYPE | |
{ | |
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); | |
return ch; | |
} |
printf (및 다른 모든 콘솔 지향 stdio 함수)가 작동하는 방식은 _read() _write()와 같은 저수준 I / O 함수의 사용자 정의 구현을 만드는 것입니다.
프로젝트에서 int _write(int file, char *ptr, int len)를 검색해보면 선언된 부분을 확인할 수가 없습니다.
기본으로 CubeIDE에서 프로젝트 작업을 할 때에는 syscalls.c 에 int _write(int file, char *ptr, int len)가 선언되어 있고, _write(int file, char* ptr, int len)에서 __io_putchar(int ch)을 호출합니다.
아래와 같이 TouchGFX Designer ( 4.13.0 )에서 생성한 Project 에는 syscalls.c 가 프로젝트에 추가되어 있지 않습니다.

하지만 프로젝트 폴더에는 syscalls.c 가 생성되어 있습니다.

생성되어 있는 syscalls.c 를 드래그하여 프로젝트에 하고, int __io_putchar(int ch) 함수를 추가하여 printf 를 사용합니다.
아니면 아래와 같이 int __io_putchar(int ch), int _write(int file, char *ptr, int len) 두 함수를 모두 추가하여 printf 를 사용할 수도 있습니다.
int __io_putchar(int ch) | |
{ | |
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); | |
return ch; | |
} | |
int _write(int file, char *ptr, int len) | |
{ | |
int DataIdx; | |
for (DataIdx = 0; DataIdx < len; DataIdx++) | |
{ | |
__io_putchar(*ptr++); | |
} | |
return len; | |
} |
개인마다 취향이 다르겠지만 저는 아무래도 syscalls.c 를 추가하는 것을 더욱 선호합니다.
CubeIDE에서 printf를 사용하게 되면 행 버퍼링이 적용되어 있습니다 ( 현재 버전 : 1.3.1 )
개행 문자가 입력되면 stdout 안의 버퍼가 출력되게 됩니다. 아니면 fflush를 통하여 버퍼를 출력해주어야 합니다.
그래서 저는 setvbuf 함수를 이용하여 원하는 순간 바로 송신이 되도록 수정해줍니다.
printf를 처음 사용하기 전에 setvbuf(stdout, NULL, _IONBF, 0); 을 추가하여 버퍼가 바로 송신되도록 수정합니다.
setvbuf 참고 사이트 : https://www.ibm.com/support/knowledgecenter/ko/ssw_ibm_i_73/rtref/setvbuf.htm
'MCU > TIP' 카테고리의 다른 글
bitband 전달하여 함수에서 사용하기 ( 이중포인터 ) (0) | 2022.06.30 |
---|---|
STM32CubeIDE 프로젝트 복사해서 재사용하는 방법 (0) | 2020.04.22 |
How to set two device with SLAVE I2C on STM32F1 (0) | 2020.03.17 |