STM32CubeMX生成的CDC收发接口分析
研究hal库生成的CDC接收接口
uint8_tUserRxBufferFS[APP_RX_DATA_SIZE];//自动生成的接收buffuint8_tUserTxBufferFS[APP_TX_DATA_SIZE];//初始化VCP收发缓冲区staticint8_tCDC_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_tCDC_Rx_Buff_Addr;uint8_tCDC_Test_Rx_Buff[100];//自定义接收缓冲区/* CDC_Receive_FS()该函数被USB设备回调用于USB外设数据接收, 在这个回调函数中通过Len获取数据长度,通过Buf指针获取数据, 通过USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);重新设置接收缓冲区地址, 通过USBD_CDC_ReceivePacket(&hUsbDeviceFS);启动设备继续接收。 */staticint8_tCDC_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_tCDC_Transmit_FS(uint8_t*Buf,uint16_tLen){uint8_tresult=USBD_OK;/* USER CODE BEGIN 7 */USBD_CDC_HandleTypeDef*hcdc=(USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;if(hcdc->TxState!=0){returnUSBD_BUSY;}USBD_CDC_SetTxBuffer(&hUsbDeviceFS,Buf,Len);result=USBD_CDC_TransmitPacket(&hUsbDeviceFS);/* USER CODE END 7 */returnresult;}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(),自定义缓冲
