STM32USB库调用CDC_TransmitFS这个函数,只能在CDC_ReceiveFS回环中发送,在main中发送数据,cdc->TxState 这个标志一直是1,所以只成功调用了USBD_CDC_SetTxBuffer,但USBD_CDC_TransmitPacket、USBD_CDC_DataIn以及后续的CDC_TransmitCplt都无法调用。
看论坛有两个解决办法:1.放到和usb同优先级的中断里调用CDC_TransmitFS进行发送。只调用成功了2.`发送之前调用这个函数EP0_RxReady。 但两种方法都会导致程序卡死。
CDC_Receive_FS与CDC_Transmit_FS均在usbd_cdc_if.c中实现,CDC_Receive_FS中调用CDC_Transmit_FS则可以正常回环收发消息。
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
CDC_Transmit_FS(Buf, *Len); /* +++lakun:将收到的数据在发回去 */
return (USBD_OK);
/* USER CODE END 6 */
}
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;
}