본문 바로가기
임베디드 관련/STM32

[STM32] 링버퍼 코드 연동 UART 수신 처리 시스템

by minhyeok.lee 2025. 5. 3.
반응형

링버퍼 코드 연동 UART 수신 처리 구조


1. process_uart_byte() 함수 구현

// 수신한 한 바이트를 처리하는 함수
void process_uart_byte(uint8_t byte) {
    static uint8_t packet_buffer[256];
    static uint16_t packet_idx = 0;

    if (byte == '\n') { // 패킷 끝 ('\n' 기준)
        packet_buffer[packet_idx] = '\0'; // 문자열 종료

        // 전체 패킷 처리
        handle_uart_packet((char *)packet_buffer);

        packet_idx = 0; // 버퍼 초기화
    } else {
        if (packet_idx < sizeof(packet_buffer) - 1) {
            packet_buffer[packet_idx++] = byte;
        } else {
            // 버퍼 오버플로우 방지
            packet_idx = 0;
        }
    }
}

2. handle_uart_packet() 함수 (명령어 처리 예시)

// 수신된 하나의 패킷(라인)을 처리하는 함수
void handle_uart_packet(const char* packet) {
    if (strcmp(packet, "LED ON") == 0) {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
        log_highlight("LED turned ON");
    } else if (strcmp(packet, "LED OFF") == 0) {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
        log_highlight("LED turned OFF");
    } else {
        log_multiline_box_highlight("Unknown command", packet);
    }
}

✨ 연동 흐름 (정리)

UART DMA 수신 -> IDLE 인터럽트 -> 링버퍼에 복사 -> 메인루프에서 pop -> process_uart_byte -> handle_uart_packet
  • DMA 수신으로 CPU 부하 없이 데이터 받기
  • IDLE 인터럽트로 데이터 수신 완료 시점 감지
  • 링버퍼 push로 받은 데이터를 모아놓기
  • 메인 루프에서 링버퍼 pop으로 차근차근 처리
  • process_uart_byte()로 1바이트씩 분석
  • handle_uart_packet()로 명령어 단위로 실제 동작

📚 "이전 링버퍼 코드"와 지금 "완성 시스템" 연동 설명

구분 링버퍼 코드 process/handle 함수
역할 데이터 "수집"까지 (DMA → 링버퍼) 수집한 데이터 "처리" (명령어 인식)
위치 USART3_IRQHandler + loop() 안 ring_buffer_pop() 호출 ring_buffer_pop()된 데이터 하나하나 처리
연결 방법 loop()에서 pop된 바이트를 process_uart_byte()에 넘겨줌 process_uart_byte()가 "라인 완성"을 감지
최종 목표 데이터 누락 없이 안전하게 모으기 명령어 단위로 정확하게 해석 및 동작

 

👉 쉽게 말하면

  • 전에 만든 코드는 '받는 구조'
  • 지금 만든 코드는 '받은 걸 쓰는 구조'

둘이 연결되어야 "완성된 UART 수신 시스템"이 됨


📦 최종 구조 요약

DMA 수신 -> IDLE 인터럽트 -> 링버퍼 push
-> loop() -> 링버퍼 pop -> process_uart_byte()
-> handle_uart_packet() -> LED 제어 / 로깅

 

CPU 부하 없음
노이즈에도 안정성 확보
대량 데이터에도 안전
명령어 기반 통신 처리까지 가능

반응형

댓글