이번 시간에는 RX 기능을 구현해 보겠습니다.
1. 기본 개념
CDC_Receive_FS() 함수는
PC에서 STM32로 데이터가 수신되었을 때 호출되는 콜백 함수입니다.
uint8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
- Buf: 수신된 데이터 버퍼 포인터
- Len: 수신된 데이터 길이 포인터
👉 즉, 여기서 수신 데이터를 읽고, 다시 CDC_Transmit_FS()로 PC에 보내주면 Echo가 되는 것입니다.
2. 코드 작성 방법
CubeIDE 프로젝트에서
USB_DEVICE/App/usbd_cdc_if.c 파일을 열어줍니다.
거기에 보면 이미 기본 CDC_Receive_FS() 함수가 만들어져 있습니다.
/**
* @brief CDC_Receive_FS
* Data received over USB OUT endpoint are sent over CDC interface
* through this function.
* @param Buf: Buffer of data received
* @param Len: Number of data received (pointer)
* @retval Result of the operation (USBD_OK / USBD_FAIL)
*/
uint8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
// 기본 코드
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
return (USBD_OK);
}
3. 여기다가 "Echo 기능" 추가하기
수정된 코드:
uint8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
// 받은 데이터 그대로 다시 전송 (Echo)
CDC_Transmit_FS(Buf, *Len);
// 수신 버퍼 다시 준비 (필수!)
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
return (USBD_OK);
}
포인트
- CDC_Transmit_FS(Buf, *Len); → 받은 데이터를 그대로 다시 전송!
- USBD_CDC_SetRxBuffer()와 USBD_CDC_ReceivePacket()은 계속 호출해줘야 함 → 다음 수신을 준비하는 동작입니다.
4. 완성!
이제 컴파일하고, 보드에 업로드하고,
TeraTerm 열어서 문자 입력해보면,
입력한 그대로 다시 출력되는 걸 볼 수 있습니다! 🎯
예를 들어:
PC 입력MCU 처리PC 출력
hello | hello 수신 → hello 송신 | hello |
test | test 수신 → test 송신 | test |
요약
순서설명
1 | usbd_cdc_if.c 파일 열기 |
2 | CDC_Receive_FS() 안에 CDC_Transmit_FS(Buf, *Len); 추가 |
3 | 빌드 후 업로드 |
4 | Tera Term에서 입력하면 Echo 확인 |
'Embedded Program' 카테고리의 다른 글
VCP (Virtual COM Port) 구현(STM32F407x) 회로도#2 (0) | 2025.04.26 |
---|---|
VCP (Virtual COM Port) 구현(STM32F407x) 회로도#1 (0) | 2025.04.26 |
VCP (Virtual COM Port) TX 구현(STM32F407x) (1) | 2025.04.25 |
FIFO vs LIFO (0) | 2025.02.09 |
실시간 운영체제(RTOS) vs 베어메탈 – 언제 RTOS를 써야 할까? (0) | 2025.02.08 |