研究hal庫生成的CDC接收接口
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];//自動生成的接收buff
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
//初始化VCP收發緩沖區
static int8_t CDC_Init_FS(void)
{
/* USER CODE BEGIN 3 */
/* Set Application Buffers */
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0); //該緩沖區可以在發送的時候自定義,在此可以注釋
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS); //該緩沖區不能注釋,雖然在接收回調函數里可以重新指定接收緩沖區,但在枚舉階段(收發之前)需要用到,但可以修改該緩沖區的大小
return (USBD_OK);
/* USER CODE END 3 */
}
uint32_t CDC_Rx_Buff_Addr;
uint8_t CDC_Test_Rx_Buff[100]; //自定義接收緩沖區
/*
CDC_Receive_FS()該函數被USB設備回調用于USB外設數據接收,
在這個回調函數中通過Len獲取數據長度,通過Buf指針獲取數據,
通過USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);重新設置接收緩沖區地址,
通過USBD_CDC_ReceivePacket(&hUsbDeviceFS);啟動設備繼續接收。
*/
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
//CDC_Rx_Buff_Addr = &Buf[0]; //地址驗證
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); // Buf[0]地址就是UserRxBufferFS[]的地址
//USBD_CDC_SetRxBuffer(&hUsbDeviceFS, CDC_Test_Rx_Buff); //接收緩沖區修改
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
return (USBD_OK);
/* USER CODE END 6 */
/*
CDC接收緩沖區疑問
USBD_CDC_SetRxBuffer()是重置CDC接收緩沖區
1.在CDC_Receive_FS()中調用USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]),Buf[0]地址就是UserRxBufferFS[]的地址
2.在CDC_Receive_FS()中不調用USBD_CDC_SetRxBuffer(),使用默認緩沖UserRxBufferFS[]
3.在CDC_Receive_FS()中調用USBD_CDC_SetRxBuffer(),自定義緩沖
*/
}
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
uint8_t result = USBD_OK;
/* USER CODE BEGIN 7 */
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
if (hcdc->TxState != 0){
return USBD_BUSY;
}
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
/* USER CODE END 7 */
return result;
}
CDC接收緩沖區疑問
USBD_CDC_SetRxBuffer()是重置CDC接收緩沖區
1.在CDC_Receive_FS()中調用USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]),Buf[0]地址就是UserRxBufferFS[]的地址
2.在CDC_Receive_FS()中不調用USBD_CDC_SetRxBuffer(),使用默認緩沖UserRxBufferFS[]
3.在CDC_Receive_FS()中調用USBD_CDC_SetRxBuffer(),自定義緩沖
浙公網安備 33010602011771號