|

楼主 |
发表于 2023-10-24 16:50:52
|
显示全部楼层
更正下,上次并没有真正解决问题,在后期的使用中陆续还是会出现问题。
经仔细排查后发现是因为PC每隔1s会轮询一遍设备的虚拟U盘,导致USB设备指针切到了U盘模式。在这种情况下,如果虚拟串口正在发送数据的话,hcdc->TxState标志会被置1,使串口在发送前的判断标志出错,从而程序执行不下去
void MC_Switch_CDC(USBD_HandleTypeDef *pdev)
{
static USBD_CDC_HandleTypeDef cdc_handle;
USBD_CDC_RegisterInterface(pdev,&USBD_CDC_fops);
pdev->pClassData = &cdc_handle;
}
void usb_printf(char* fmt,...)
{
uint16_t i,len;
va_list ap;
MC_Switch_CDC(&USBD_Device); //每次发送前切换到CDC模式(串口),防止PC将设备切换到MSC模式(U盘)
va_start(ap,fmt);
vsprintf((char*)USART_PRINTF_Buffer,fmt,ap);
va_end(ap);
len=strlen((const char*)USART_PRINTF_Buffer);
for(i=0;i<len;i++)
{
USB_USART_SendData(&USART_PRINTF_Buffer);
}
SCB_CleanDCache_by_Addr((uint32_t *)USART_PRINTF_Buffer,i);
}
|
|