Как максимизировать скорость передачи данных через USB (настроен как виртуальный com порт) - PullRequest
0 голосов
/ 31 августа 2018

У меня проблемы с настройкой потоковой передачи через OTG-USB-FS, настроенный как VCP. В моем распоряжении есть плата nucleo-h743zi, которая неплохо справляется с отправкой мне данных, но на стороне ПК у меня проблема с получением этих данных.

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 байта).

это код Слушателя, держу пари, что это не так, как должно быть, поэтому я здесь, чтобы искать советы. Я прыгал, что, возможно, возможна полная потоковая передача без управляющих последовательностей («копирование»), но в этом случае я не могу получить соседние данные (в пределах одного блока передачи это нормально, но два последовательных полученных блока не соседствуют.

Пример: block_1: 1 2 3 4 5 6 блок_2: 13 14 15 16 17 18

Есть ли способ ускорить мой прием? (Я безуспешно пробовал ключ O2)

1 Ответ

0 голосов
/ 21 ноября 2018

Вам необходимо настроить буфер на стороне ПК, который будет в 2 или 3 раза больше буфера, который вы переносите с вашей платы, и использовать что-то вроде схемы двойного буфера для передачи данных. Вы передаете первый буфер во время подачи второго, затем чередуете. Хорошо бы активировать кеш и поместить буферы в быструю память для stm32h7 (это ОЗУ на 1 домен).

Но если ваш интерфейс не соответствует необходимой вам скорости, то никаких хитростей для этого не будет. За исключением, может быть, одного, если ваш контроллер достаточно быстр -> вы можете реализовать и использовать сжатие данных без потерь на этих ваших данных и передавать сжатые файлы. Если вы передаете данные с низкой энтропией, это может значительно повысить скорость.

...