반응형
링버퍼 코드 연동 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 부하 없음
✅ 노이즈에도 안정성 확보
✅ 대량 데이터에도 안전
✅ 명령어 기반 통신 처리까지 가능
반응형
'임베디드 관련 > STM32' 카테고리의 다른 글
STM32 HAL 함수 정리 (1) | 2025.05.09 |
---|---|
STM32 용어/약어 정리 (0) | 2025.05.08 |
[STM32] DMA + IDLE + 링버퍼 실전 (1) | 2025.05.02 |
[STM32] DMA + 인터럽트 + 링버퍼 수신 방식의 개념 (0) | 2025.05.01 |
[STM32] DMA vs 인터럽트 (0) | 2025.04.30 |
댓글