研究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号