
研究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_tresultUSBD_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);resultUSBD_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()自定义缓冲