UART串口常用波特率最高115200的情况下,理论传输速度极限是11KB/s,实际使用差不多在5KB/s左右,使用USB虚拟串口除去不需要设置波特率这个优点以外,主要还是希望提高传输速度,缩短下载数据花费的时间。然而在简单配置虚拟串口替代串口后,发现传输速度没有明显变化,所以实验一下虚拟串口的传输速度的主要影响因素。
首先查看一下CubeMX生成的usb相关源码
复位(每次USB插上时,触发USB外设复位):
void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
{
USBD_SpeedTypeDef speed = USBD_SPEED_FULL;
if ( hpcd->Init.speed != PCD_SPEED_FULL)
{
Error_Handler();
}
/* Set Speed. */
USBD_LL_SetSpeed((USBD_HandleTypeDef*)hpcd->pData, speed);
/* Reset Device. */
USBD_LL_Reset((USBD_HandleTypeDef*)hpcd->pData);
}
其中配置了传输速率,这个速率可以在CubeMx里修改,所以代码就不用动了
由于我研究的是发送,所以接收就不看了,直接看虚拟串口发送:
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;
}
基本逻辑是判断TxState(发送状态标志)看发送是否处于进行中,如果目前没有发送任务,才给USB外设传入发送任务,源码里我没有找到完成任务后清除这个标志的内容,