코드

#include <stdio.h>
#include <stdarg.h>
#include <time.h>

void printf_log(const char *format, ...);

int main()
{
    printf_log("This is a log message");
    return 0;
}

void printf_log(const char *format, ...)
{

    // 현재 시간을 문자열로 변환
    time_t now = time(NULL);
    struct tm *now_tm;
    char time_str[20];
    time(&now);
    now_tm = localtime(&now);
    strftime(time_str, sizeof(time_str), "[%Y-%m-%d %H:%M:%S]", now_tm);

    va_list args;
    va_start(args, format);
    printf("%s", time_str); // 로그 메시지 출력
    vprintf(format, args);
    fflush(stdout); // stdout 버퍼를 강제로 플러시
    va_end(args);
}

 

결과

 

 

 

 


[참고]https://docs.m5stack.com/en/arduino/m5cardputer/sdcard

 

m5-docs

Product Tutorial

docs.m5stack.com

 

void printf_log(const char *format, ...) {
    char buf[256];
    va_list args;
    va_start(args, format);
    vsnprintf(buf, 256, format, args);
    va_end(args);
    Serial.print(buf);
    canvas.printf(buf);
    canvas.pushSprite(0, 0);
}

 

 

 

 

 

Tera Term과 MCU를 COM포트로 연결할 때

드라이버 미인식 오류인 것 같다.

 

 

해결 방법 [윈도우]

 

장치관리자

 

포트

우클릭 > 드라이버 업데이트

 

> 내 컴퓨터에서 드라이버 찾아보기 (R)

 

> 컴퓨터의 사용 가능한 드라이버 목록에서 직접 선택 (L)

 

> 다음

 

> 닫기

 

다시 인식이 된다.

 

내 컴퓨터에 드라이버가 없다면

 

드라이버 다운로드 하기

https://www.prolific.com.tw/us/showproduct.aspx?p_id=225&pcid=41

 

Products

PL2303 Windows Driver Download   USB to UART RS232 Serial Windows Driver Installer Setup Program ( Win7 / Win8.1 / Win10 / Win11) Installer version & Build date: 4.3.0.0 (2024-07-15) Windows 11 ( 64-bit ) WDF WHQL Driver: v3.9.6.0 (06/17/2024) / v5.2.7.0

www.prolific.com.tw

 

비동기 방식으로 UART Receive(데이터 수신)을 시도하던 중,

 

UART_EVENT_RX_CHAR and UART_EVENT_RX_COMPLETE

events are not fired when data comes. 

 

디버깅 시, 위 데이터 수신 이벤트들이 case문에 걸리지 않는 문제를 마주하였다.

 

void uart_callback(uart_callback_args_t *p_args){
    switch(p_args->event){
        // Transmit
        case UART_EVENT_TX_COMPLETE:
        {
            g_uart_tx_complete = true; 
            break;
        }
        // Receive
        case UART_EVENT_RX_CHAR:
        {
            g_rx_buffer[g_rx_index++] = (uint8_t)p_args->data;
            if ((uint8_t)p_args->data == END_CHARACTER || g_rx_index >= UART_RX_BUF_SIZE) {
                g_rx_buffer[g_rx_index] = '\0'; 
                g_rx_index = 0; 
                g_uart_rx_complete = true;
            }
            break;
        }
        // this event is fired when rx buffer is full
        case UART_EVENT_RX_COMPLETE:
            g_uart_rx_complete = true;
            break;
    }
}

UART 콜백함수는 위와 같다.

 

이벤트가 트리거되지 않는 이유를 확인하기 위해 여러 방법을 시도해 보았는데,

 

  • PC와 MCU를 연결하는 케이블에서 신호가 오실로스코프로 수신되는지 확인하기. 신호는 수신되었다.

 

 

  • 동기화 메서드가 기능하는지 확인했고, 정상적으로 작동하고 있었다.

동기 방식으로 작동하는지 확인하기 위해

콜백 함수에서 Receive 관련 코드를 작성하지 않고

hal_entry()의 while(1)문 내부에서 반복적으로 호출해보았다.

 

 

 

결과는 첫 번째 R_SCI_UART_Read() 호출은 성공

이후 반복적 호출에서는 8번 오류 발생

 

FSP_ERR_IN_USE = 8, ///< Channel/peripheral is running/busy

첫 번째 R_SCI_UART_Read() 호출에서 수신 완료 이벤트 발생하지 않아서

채널 또는 주변장치가 사용되고 있다는 에러가 발생한 것이다.

 

그럼 R_SCI_UART_Read() 호출은 정상작동한다는 것이다.

 

 

  • Tera Term 설정과 FSP 설정이 동일한지 확인했다. (속도, 데이터, 패리티, 스톱 비트, 플로우 컨트롤 등)

동일함을 확인했고, 플로우 컨트롤은 none으로 지정하였다.

 

  • 마지막으로 uart_callback() 함수에서 코드가 디버그 포인트에 멈추는지, 그리고 해당 사례를 디버깅했다.

UART_EVENT_RX_COMPLETE, UART_EVENT_RX_CHAR 

이벤트가 발생하지 않았다.

 

이전에 오실로스코프로 확인한 결과

PC와 MCU를 연결해주는 케이블에서 

한 글자를 Tera Term에 입력할 때마다, 신호가 가는 것은 확인했기 때문에

 

HW문제(핀 문제)인지 의심하게 되었다.

 

 

[해결책] 그런 다음 UART 핀을 100, 101에서 410, 411로 변경했는데 (FSP Configuration도 함께 변경함)

UART_EVENT_RX_COMPLETE, UART_EVENT_RX_CHAR   이벤트가 잘 fire되었다.

 

 

 

결론은, 모든 방법으로도 확인 불가하면

핀 문제인지 의심해보길.

 

-Joo-

+ Recent posts