본문 바로가기
Embedded Program

VCP (Virtual COM Port) RX 구현(STM32F407x)

by rlawnsghtest 2025. 4. 25.

이번 시간에는 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 확인