null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
송수신 구현
#uart
#tx
#rx
#polling
#asclin
@devpc
|
2026-04-02 05:47:09
|
GET /api/v1/nodes/207?nv=1
History:
v1 (2026-04-02) (Latest)
0
Views
3
Calls
# 송수신 구현 ## 폴링 방식 UART 폴링(Polling) 방식은 **데이터를 보내거나 받을 준비가 될 때까지 CPU가 기다리는** 방식입니다. 구현이 단순하고 디버깅이 쉬워 학습 단계에 적합합니다. ``` [ 폴링 TX 흐름 ] 데이터 전송 요청 | v TX FIFO 비어있나? ──No──> 대기 (폴링) | ↑ Yes │ | │ 데이터를 FIFO에 쓰기 ─────────┘ | v 하드웨어가 자동으로 직렬 전송 ``` ``` [ 폴링 RX 흐름 ] RX FIFO에 데이터 있나? ──No──> 대기 (폴링) | ↑ Yes │ | │ FIFO에서 데이터 읽기 ───────────────┘ | v 애플리케이션에서 처리 ``` --- ## iLLD: IfxAsclin_Asc 초기화 ```c #include "IfxAsclin_Asc.h" #include "IfxAsclin_PinMap.h" /* 드라이버 핸들 및 버퍼 (전역 변수) */ static IfxAsclin_Asc g_ascHandle; static uint8 g_txBuf[256]; static uint8 g_rxBuf[256]; static Ifx_SizeT g_txBufSize = sizeof(g_txBuf); static Ifx_SizeT g_rxBufSize = sizeof(g_rxBuf); void uart_init(void) { IfxAsclin_Asc_Config config; /* 1. 기본 설정 로드 */ IfxAsclin_Asc_initModuleConfig(&config, &MODULE_ASCLIN0); /* 2. 보레이트 설정 */ config.baudrate.baudrate = 115200; config.baudrate.oversampling = IfxAsclin_OversamplingFactor_16; /* 3. 프레임 설정 (8N1) */ config.frame.dataLength = IfxAsclin_DataLength_8; config.frame.stopBit = IfxAsclin_StopBit_1; config.frame.parityBit = FALSE; /* 4. 핀 설정 (TX: P15.2, RX: P15.3 — 보드에 따라 다름) */ config.pins.tx = &IfxAsclin0_TX_P15_2_OUT; config.pins.rx = &IfxAsclin0_RX_P15_3_IN; config.pins.cts = NULL_PTR; config.pins.rts = NULL_PTR; /* 5. 버퍼 설정 */ config.txBuffer = g_txBuf; config.txBufferSize = g_txBufSize; config.rxBuffer = g_rxBuf; config.rxBufferSize = g_rxBufSize; /* 6. 초기화 */ IfxAsclin_Asc_initModule(&g_ascHandle, &config); } ``` --- ## 데이터 송신 (TX) ```c void uart_send(const uint8 *data, Ifx_SizeT length) { /* 폴링 방식: 전송 완료까지 대기 */ IfxAsclin_Asc_write(&g_ascHandle, data, &length, TIME_INFINITE); } /* 사용 예 */ uint8 msg[] = "Hello, TC37x!\r\n"; uart_send(msg, sizeof(msg) - 1); ``` `TIME_INFINITE`는 전송이 완료될 때까지 무한 대기합니다. 타임아웃이 필요한 경우 `IfxStm_getTicksFromMilliseconds()`로 시간을 지정합니다. --- ## 데이터 수신 (RX) ```c Ifx_SizeT uart_receive(uint8 *buf, Ifx_SizeT maxLength) { Ifx_SizeT len = maxLength; IfxAsclin_Asc_read(&g_ascHandle, buf, &len, TIME_INFINITE); return len; /* 실제로 읽은 바이트 수 */ } ``` ### 비블로킹 수신 (데이터가 있을 때만) ```c Ifx_SizeT uart_receive_nonblocking(uint8 *buf, Ifx_SizeT maxLength) { /* RX FIFO에 쌓인 바이트 수 확인 */ Ifx_SizeT available = IfxAsclin_Asc_getReadCount(&g_ascHandle); if (available == 0) return 0; /* 수신 데이터 없음 */ Ifx_SizeT len = (available < maxLength) ? available : maxLength; IfxAsclin_Asc_read(&g_ascHandle, buf, &len, TIME_INFINITE); return len; } ``` --- ## 송수신 전체 예제: Echo 수신한 데이터를 그대로 돌려보내는 Echo 프로그램: ```c void core0_main(void) { uart_init(); uint8 rxBuf[64]; Ifx_SizeT rxLen; while (1) { /* 수신 */ rxLen = sizeof(rxBuf); IfxAsclin_Asc_read(&g_ascHandle, rxBuf, &rxLen, TIME_INFINITE); /* 에코 (받은 데이터 그대로 송신) */ if (rxLen > 0) { IfxAsclin_Asc_write(&g_ascHandle, rxBuf, &rxLen, TIME_INFINITE); } } } ``` ``` [ Echo 동작 흐름 ] PC 터미널 TC37x ────────── ────── "Hello" 입력 ──── TX ──────────→ RX 수신 에코 처리 "Hello" 출력 ←─── TX ────────── TX 송신 ``` --- ## 다른 MCU와의 차이점 > ⚠️ 다른 MCU에서 넘어온다면 이런 점이 다를 수 있습니다. - **STM32**: `HAL_UART_Transmit()`, `HAL_UART_Receive()`. 폴링 방식 개념 동일. - **Arduino**: `Serial.write()`, `Serial.read()`. 내부적으로 동일한 폴링/버퍼 구조. - **공통 개념**: TX FIFO에 쓰고 HW가 직렬 전송, RX FIFO에서 읽기 — 모든 UART에서 동일. - **TC37x 특징**: iLLD가 소프트웨어 링 버퍼를 제공하므로, 여러 바이트를 한번에 버퍼에 넣고 비동기로 처리 가능.
// COMMENTS
Newest First
ON THIS PAGE