Чтение с последовательного порта через ReadFile очень медленное - PullRequest
0 голосов
/ 18 февраля 2019

Я использую Win32 API для чтения данных с последовательного порта:

DWORD numRead = 0;
ReadFile(mPortHandle, mReceiveBuffer.get(), mReceiveBufferSize, &numRead, nullptr);

Этот вызов занимает очень долго : 129 мс, чтобы быть точным (измеряется через QueryPerformanceCounter).

Я провел измерения с несколькими различными аппаратными устройствами:

  • USB-адаптер с набором микросхем FTDI
  • USB-адаптер с набором микросхем
  • PCI Express RS232 карта
  • Встроенный последовательный порт материнской платы

Каждая из этих устройств дает мне точно такую ​​же задержку: 129 мс.Таким образом, я не думаю, что это аппаратная ошибка или ошибка драйвера (каждое устройство должно использовать совершенно другой драйвер, верно?).

Я также возился с таймаутами, но это ничего не изменило.

Что еще это может быть?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

ОК, проблема решена: -)

До сих пор я устанавливал таймауты так:

COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = 1;
timeouts.ReadTotalTimeoutMultiplier = 1;
timeouts.ReadTotalTimeoutConstant = 1;
timeouts.WriteTotalTimeoutMultiplier = 1;
timeouts.WriteTotalTimeoutConstant = 1;

Это не работает .Если я устанавливаю только константу, она работает:

COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = 0;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 1;
timeouts.WriteTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 0;

Теперь ReadFile возвращается в течение 1 мс.

0 голосов
/ 18 февраля 2019

Возможно, это потому, что вы всегда читаете файл, указав общий размер буфера приема.

Большой ли размер буфера приема?

Если вы зарегистрируете обработчик события для события DataReceived и будете считывать только данные, поступающие в буфер драйвера устройства, дополнительное время ожидания будет сокращено.

...