首页 > 解决方案 > 如何通过 USB 最大化数据传输速度(配置为虚拟 COM 端口)

问题描述

我无法通过配置为 VCP 的 OTG-USB-FS 进行流式传输。在我的处置中,我有一个 nucleo-h743zi 板,它似乎在向我发送数据方面做得很好,但在 PC 端接收数据时我遇到了问题。

for(;;) {

#define number_of_ccr 1024
unsigned int lpBuffer[number_of_ccr] = {0};
unsigned long nNumberOfBytesToRead = number_of_ccr*4;
unsigned long lpNumberOfBytesRead;


QueryPerformanceCounter(&startCounter);  
ReadFile(
  hSerial,
  lpBuffer,
  nNumberOfBytesToRead,
  &lpNumberOfBytesRead,
  NULL
  );

if(!strcmp(lpBuffer, "end\r\n")) {
  CloseHandle(FileHandle);
  fprintf(stderr, "end flag was received\n");
  break;
}
else if(lpNumberOfBytesRead > 0) {
  // NOTE(): succeed
  QueryPerformanceCounter(&endCounter);
  time = Win32GetSecondsElapsed(startCounter, endCounter);

  char *copyString = "copy";
  WriteFile(hSerial, copyString , strlen(copyString), &bytes_written, NULL);
  DWORD BytesWritten;
  // write data to file
  WriteFile(FileHandle, lpBuffer, nNumberOfBytesToRead, &BytesWritten, 0);
}

}

QPC 显示速度为 0.00733297970 - 这是一次成功的数据块传输(1024*4 字节)。

这是Listener代码,我敢打赌这不是应该的,所以我在这里寻求建议。我一直在想,可能没有控制序列(“复制”)的完整流式传输是可能的,但在这种情况下,我无法接收相邻数据(在一个传输块内没关系,但两个连续接收的块不相邻。

示例:block_1:1 2 3 4 5 6 block_2:13 14 15 16 17 18

有什么方法可以加快我的收货速度吗?(我正在尝试 O2 密钥但没有成功)

标签: windowswinapiserial-portusbstm32

解决方案


您需要在 PC 端配置 2 或 3 倍于您从电路板传输的缓冲区的缓冲区,并使用类似双缓冲区方案来传输数据。您在归档第二个缓冲区时传输第一个缓冲区,然后交替。好的做法是激活缓存,并将缓冲区放在 stm32h7 的快速内存中(它是 1 个域 RAM)。

但是,如果您的界面与您需要的速度不匹配,则没有任何技巧可以做到这一点。除了一个,如果您的控制器足够快 - >您可以对您的数据实施和使用无损数据压缩并传输压缩文件。如果您传输低熵数据,这可以大大提高速度。


推荐阅读