STM32 USB CDC Win 10丢失一些数据

STM32 USB CDC Win 10丢失一些数据,usb,stm32,cdc,virtual-serial-port,stm32cubemx,Usb,Stm32,Cdc,Virtual Serial Port,Stm32cubemx,我使用USB设备-意法半导体开发板。使用支持usb硬件的固件。它作为USB串行端口工作 在主机PC(win10 21H1)上,我使用串行终端(“Tera术语”)从设备获取数据。我使用标准windows USB串行驱动程序 我的设备正在发送数据。如果数据流很小(1-2-5 kByte/s)-所有工作正常。但如果我加速(流量大约为100kbyte/s或更高),我会看到数据丢失 我与意法半导体公司的支持部门进行了沟通。我们检查了这个问题。我们看到了USB与USB分析仪的通信。我们认为,这不是windo

我使用USB设备-意法半导体开发板。使用支持usb硬件的固件。它作为USB串行端口工作

在主机PC(win10 21H1)上,我使用串行终端(“Tera术语”)从设备获取数据。我使用标准windows USB串行驱动程序

我的设备正在发送数据。如果数据流很小(1-2-5 kByte/s)-所有工作正常。但如果我加速(流量大约为100kbyte/s或更高),我会看到数据丢失

我与意法半导体公司的支持部门进行了沟通。我们检查了这个问题。我们看到了USB与USB分析仪的通信。我们认为,这不是windows端的问题

此外,我还使用自定义端口读取实用程序。数据完整性问题仍然存在

在收到的数据中,我看到丢失了64或128。。。64字节的倍数。64字节-在我的情况下,端点大小。有关详细信息,请参见链接数据

我在CubeMx中创建了USB_测试项目。并添加向PC发送数据的简单代码。如果以前的CDC传输完成,则循环数据发送。增加延误是不可接受的:首先,它不是100%消除损失;其次,它对信道的带宽有不良影响

//in main() function 

uint8_t is_transmit = 0;

HAL_Delay(5000);
uint8_t Buf[2048];
uint8_t k = 48;
// fill the array with printable characters
for(uint16_t i=0; i<sizeof(Buf)-2; i++){
    if(k > 100) {
        k = 48;
    }
    Buf[i] = k++;
}
// array - is a one string line
Buf[sizeof(Buf)-2] = '\r';
Buf[sizeof(Buf)-1] = '\n';
        
    
while (1)
{
    if(is_transmit == 0){
        is_transmit = 1;
        //HAL_Delay(1); // add delay on 1 ms reduces the likelihood of losses by an order of magnitude
        CDC_Transmit_FS(Buf, sizeof(Buf));
    }
}
来自ST支持通信和USB analyzer日志文件的信息。

我如何解决这个问题?我需要从设备到主机的数据流为500 kB/s或更大


向您致意,Andrey。

windows串行端口驱动程序堆栈似乎包含许多控制传输速度的代码。在最初的版本中,串行端口可能是有意义的,但它阻碍了现代基于USB的高速通信。尝试提高波特率(即使理论上与此无关)。或者,丢弃CDC并使用特定于供应商的USB设备。1。通讯速度不受影响。2.丢弃stm32设备中的CDC并使用CP210x或FTDI-否,我需要同步其他USB(通过软件包)。CP210x不提供这个。谢谢你的解决方案。我不建议使用CP210x或FTDI芯片。相反,我建议使用STM32的USB端口实现一个或两个具有设备描述符的批量端点,该设备描述符不将设备声明为虚拟串行设备(USB CDC ACM)。在Windows端,您将需要WinUSB而不是串行端口API。“通信速度不受影响”是什么意思?谢谢,我来看看什么是WinUSB(现在我们的软件使用串口)。我的意思是端口波特率设置。我知道winusb。使用winusb需要从设备和主机端进行一些工作。但最可怕的是调试和测试,测试,测试。。。。并在所有设备生命周期阶段提供支持。我非常希望保留串口的功能。这对我们队来说是一个很大的负担。这是极不可取的。但我们会考虑这种可能性在潜在的结果中。
static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum)
{
    ---
    extern uint8_t is_transmit;
    is_transmit = 0;
    ---

  return result;
}