Чтение по USB 2.0 с ft232h

Посмотрел в wireshark, что там происходит. Увидел несколько передач по usb с интервалами в 125мкс, но последний почему-то 1мс. Подумал, что дело в том, что если вдруг запрашиваемый объем больше, чем есть на самом деле, то libusb_bulk_transfer, который вызывается внутри libftdi ожидает latency time.

Библиотека устроена так, что ftdi_read_data физически считывает chunkSize байтов, а помещает в буфер toRead байтов, внутри ftdi_read_data откидывает служебные 2 байта.

Я попытался подогнать размер чтения, чтобы он всегда соответствовал размеру байтов, которые я хочу считать по шине (с учётом служебных байтов). В итоге это не помогло. Раньше, если, например установить chunkSize в 1024, а toRead 1020, то скорость заметно возрастала, и в wireshark было видно, что задержки нет. Сейчас я делаю то же самое, но в обратном порядке. Т. е. теперь, если я хочу считать 1024 байта, то я запрошу 1030 (chunkSize). Почему-то задержка есть всегда. Или принципиально, чтобы chunkSize был кратен 512 байтам?

C++Выделить код

1
2
3
4
5
6
7
8
9
10
11
12
13

                // Это все в цикле, пока totalReadBytes не сравняется с localBytesWritten.
                int toRead = localBytesWritten - totalReadBytes;
                // Добавляю место под служебные байты
                int chunkSize = toRead + toRead/512  2 + 2;
                // если со служебными байтами появился еще один блок в 512 байт, то для него тоже нужно добавить 2 служебных байта
                if (chunkSize/512 > toRead/512)
                    chunkSize += 2;
                int cChunkSize = 0;
                ftdi_read_data_get_chunksize(ftdi, &cChunkSize);
                if (chunkSize != cChunkSize) {
                    ftdi_read_data_set_chunksize(ftdi, chunkSize);
                }
                int bytesRead = ftdi_read_data(ftdi, readData + offset + totalReadBytes, toRead);