|
下位机使用stm官方的USB cdc device hal库,一直连续向上位机发送数据(每次2KB),上位机调用的是windows自带的串口接口函数(无等待,每2K立即读出),连续发送几十K后就会丢失一些数据,然后在下位机每次发送时增加800us以上的延时,上位机接收就能全部接收正确,大神分析下是哪儿的问题还是虚拟串口发送快了都会有丢包,发送程序如下:
uint8_t USBCom_SendBufNow(uint8_t *Buf, uint16_t Len)
{
uint32_t len;
uint32_t uiStartTime;
uint16_t i;
uint8_t re;
//USB未连接
if (false == USB_DevConnecteState())
{
return USBD_FAIL;
}
/*发送缓冲区最大长度的数据*/
len = sizeof(UserTxBufferFS);
for (i = 0; i < Len / len; i++)
{
memcpy(UserTxBufferFS, Buf, len);
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, len);
uiStartTime = bsp_GetRunTime();
while (1)
{
re = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
if (re == USBD_OK)
{
break;
}
else if (re == USBD_BUSY)
{
if (bsp_CheckRunTime(uiStartTime) >= USB_TIME_OUT)
{
BSP_Printf("USB part 1 Data Send busy timeout !\r\n");
break;
}
else
{
continue;
}
}
else if (re == USBD_FAIL)
{
break;
}
}
Buf += len;
}
/*发送剩余部分*/
len = Len % len;
if (len > 0)
{
memcpy(UserTxBufferFS, Buf, len);
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, len);
uiStartTime = bsp_GetRunTime();
while (1)
{
re = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
if (re == USBD_OK)
{
break;
}
else if (re == USBD_BUSY)
{
if(bsp_CheckRunTime(uiStartTime) >= USB_TIME_OUT)
{
BSP_Printf("USB last part Data Send busy timeout!\r\n");
break;
}
else
{
continue;
}
}
else if (re == USBD_FAIL)
{
break;
}
}
}
return re;
}
|
|