/**
* @brief Data received over USB OUT endpoint are sent over CDC interface
* through this function.
*
* @note
* This function will block any OUT packet reception on USB endpoint
* untill exiting this function. If you exit this function before transfer
* is complete on CDC interface (ie. using DMA controller) it will result
* in receiving more data while previous ones are still not sent.
*
* @param Buf: Buffer of data to be received
* @param Len: Number of data received (in bytes)
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
*/
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
uint32_t buffsize;
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); //給USB庫指定一個接收緩衝區,讓USB控制器收到數據以後可以往裏填。
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
if(1) //調用了CDC_Transmit_FS做回聲
{
if(UserTxBufPtrIn + *Len <= APP_TX_DATA_SIZE) //判斷緩衝區是否足夠
{
memcpy((uint8_t*)(UserTxBufferFS + UserTxBufPtrIn), Buf, *Len);
UserTxBufPtrIn += *Len;
}
else
{
memcpy((uint8_t*)(UserTxBufferFS), Buf, *Len); //從0開始
UserTxBufPtrIn = *Len;
UserTxBufPtrOu t= 0;
}
if(UserTxBufPtrOut != UserTxBufPtrIn)
{
if(UserTxBufPtrOut > UserTxBufPtrIn) /* Rollback */
{
buffsize= UserTxBufPtrIn;
}
else
{
buffsize = UserTxBufPtrIn - UserTxBufPtrOut;
}
CDC_Transmit_FS((uint8_t*)(UserTxBufferFS+UserTxBufPtrOut),buffsize); //調用了CDC_Transmit_FS做回聲
UserTxBufPtrOut += buffsize;
}
}
else
{
}
return (USBD_OK);
/* USER CODE END 6 */
}