我使用 USB 设备 - STMicroelectronics 开发板。使用支持 USB 硬件的固件。它作为 USB 串行端口工作。
在主机 PC(win10 21H1)上,我使用串行终端(“Tera Term”)从我的设备获取数据。我使用标准的 windows usbserial 驱动程序。
我的设备正在发送数据。如果数据流很小(1-2-5 kByte/s)——一切正常。但是如果我加快速度(流量大约 100 kByte/s 或更多) - 我会看到数据丢失。
我与意法半导体的支持人员进行了沟通。我们检查了问题。我们看到了 USB 与 USB 分析仪的通信。我们认为,这不是windows方面的问题。
此外,我使用自定义端口读取实用程序。数据完整性问题仍然存在。
在收到的数据中,我看到丢失了 64 或 128 ...... 64 字节的倍数。64bytes - 就我而言,端点大小。有关更多信息,请参阅链接数据。
我在 CubeMx 中创建 USB_test 项目。并添加用于向 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));
}
}
在 CDC_TransmitCplt_FS() 中,我闪存 is_transmit。
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;
}
来自 ST 的信息支持通信和 USB 分析仪日志文件。 https://drive.google.com/drive/folders/1CvTPfaFGmcFxD4V5zTvsVE6U26DNwG2v?usp=sharing
我如何解决这个问题?我需要从设备到主机 500 kB/s 或更多的数据流。
最好的问候,安德烈。