Ftd2xx optymalny bufor dla latency timer 8ms
FT_SetUSBParameters
) na domyślne 4096 B (4 kB) – w 99 % przypadków jest to najbardziej efektywny kompromis dla Latency Timer = 8 ms
. FT_Read
dobierz tak, aby pomieścić ilość danych możliwych do napłynięcia w 8 ms:FT_Write
) wysyłaj dane w wielokrotnościach 64 B (Full-Speed) lub 512 B (High-Speed), najlepiej 4–16 kB.Kluczowe punkty
• Domyślny bufor 4 kB sterownika FTDI już jest dopasowany do 8 ms w większości realnych scenariuszy.
• Bufor aplikacji = ≥ (baud/10)·0,008 s, zaokrąglony w górę do przyjaznej wielkości (potęga 2 / wielokrotność 64 lub 512 B).
• Zbyt mały bufor powoduje nadmiarowe wywołania API, zbyt duży – rosnące, niepotrzebne opóźnienie i użycie RAM.
Latency Timer
Latency Timer
. Dla UART 8N1 (10 bitów/bajt):
\[
N_{8\,\text{ms}}\,[\text{B}] = \frac{\text{baud}}{10} \times 0{,}008
\]
Przybliżone wartości:
Baudrate | Bajty w 8 ms | Proponowany bufor aplikacji |
---|---|---|
9 600 | ~8 | 128–256 B (min. 64 B) |
57 600 | ~46 | 256 B |
115 200 | ~92 | 256 B |
230 400 | ~184 | 512 B |
460 800 | ~369 | 1 kB |
921 600 | ~737 | 1 kB |
1 000 000 | 800 | 1 kB |
3 000 000 | 2 400 | 4 kB |
Bufor aplikacji warto powiększyć ×1,5 – 2 dla marginesu jittera w systemie operacyjnym.
Latency Timer
nie dotyczy zapisu. Zalecenia:
• Full-Speed: wysyłaj paczki 64 B·N (np. 512, 1024, 4096 B).
• High-Speed: paczki 512 B·N (najczęściej 4 kB, 8 kB, 16 kB).
• Utrzymuj FT_SetUSBParameters
Tx ≥ wielkość jednego wywołania FT_Write
.
Latency Timer
= 1 ms, bo zbiega się z ramką USB FS (1 ms). FT_SetEventNotification
), co obniża wymagania co do wielkości bufora aplikacji.Przykładowy fragment C:
DWORD usbRx = 4096, usbTx = 4096;
FT_SetUSBParameters(h, usbRx, usbTx); // sterownik
DWORD latency = 8; // 8 ms
FT_SetLatencyTimer(h, (UCHAR)latency);
DWORD q, got;
uint8_t buf[1024]; // dla 921600 bps
while (1) {
FT_GetQueueStatus(h, &q);
if (q) {
FT_Read(h, buf, sizeof(buf), &got);
process(buf, got);
}
}
Brak specyficznych kwestii etycznych; prawnie należy zapewnić, że sterownik FTDI pochodzi z oficjalnego źródła (licencja FTDI CDM).
Latency Timer
lub bufor sterownika; jeśli utrata danych – zwiększ bufor aplikacji lub prędkość odczytu. libftdi
/ftdi-sio
ma stały 16 kB bufor kernela; opisane wartości odnoszą się do Windows D2XX/VCP. Latency Timer
może osiągać limit magistrali — obserwuj USBPcap
.FT_W32_WaitCommEvent
kontra FT_GetQueueStatus
(wydajność CPU). FT_SetFlowControl(FT_FLOW_RTS_CTS)
na stabilność przy wysokim baudrate. Dla Latency Timer = 8 ms
najbezpieczniej:
• pozostawić bufor sterownika USB na 4 kB,
• dobrać bufor aplikacji tak, aby pomieścił dane napływające w 8 ms (≈(baud/10)*0,008 s),
• wysyłać dane w wielokrotnościach pakietu USB.
Takie ustawienia zachowują niski jitter i minimalizują przepełnienia bez zbędnego obciążania CPU.
To mam ftd2xx transmisja 115200 latency timer 8 jaki bufor optymalny. Chip 232r
• Przy FT232R, prędkości 115 200 bps i Latency Timer = 8 ms optymalny jest:
– bufor sterownika (FT_SetUSBParameters) – pozostawić domyślne 4096 B/4096 B,
– bufor aplikacji przekazywany do FT_Read – 256 B (minimum 128 B).
• Dla zapisu (FT_Write) wysyłać dane w wielokrotnościach 64 B.
rxBuffer
) jest ostatnim magazynem; jego rozmiar wpływa na liczbę wywołań API i latencję po stronie programu, ale nie zmienia sposobu, w jaki kontroler USB wysyła pakiety.UART 8N1 = 10 bitów/bajt
(115200 \text{bps} / 10 = 11520 \text{B/s})
Dane zebrane w 8 ms: (11520 \times 0{,}008 \simeq 92 \text{B})
• ≥ 92 B aby pomieścić dane z jednego okresu timer-a.
• + zapas na jitter OS/USB → 128 B wystarcza, 256 B daje 175 % marginesu i pozostaje potęgą 2.
• Większy bufor (512 B–1 kB) nie zaszkodzi, lecz nie zmniejszy opóźnienia – zwiększy jedynie ślad w RAM.
Sterownik wysyła dane gdy:
a) zapełni się pakiet 64 B, lub
b) upłynie Latency Timer (8 ms).
Dla ciągłego strumienia 115 200 bps pakiet 64 B zapełnia się w ≈5,5 ms, więc timer rzadko decyduje.
Przy transmisjach krótkich (ramki, komendy) to właśnie timer wyznacza maksymalne opóźnienie.
Latencja timera nie wpływa na kierunek PC → FTDI.
Wysyłaj bloki 64 B, 128 B, 256 B… aby:
• wypełnić pakiety USB,
• zminimalizować overhead protokołu.
• Najnowsze AN232B-04 (akt. marzec 2024) podkreśla, że wartości Latency Timer < 2 ms mogą obciążać CPU, a większe niż 16 ms rzadko mają sens w Full-Speed.
• Wersje sterownika FTDI D2XX ≥ v3.13 poprawiły „USB transfer optimisation”, dlatego pozostawienie 4096 B jest obecnie rekomendowane.
• Coraz częściej stosuje się FT-X-series (FT260/FTDI3xx) z trybem Hi-Speed – przy nich algorytm doboru bufora zmienia się (512 B pakietów USB). Twoja konfiguracja dotyczy jednak Full-Speed.
• Potęgi 2 dla bufora aplikacji ułatwiają maskowanie indeksów pierścieniowych.
• Przy odbiorze event-driven (FT_SetEventNotification
, „FD_READ”) latencja zależy głównie od systemu operacyjnego; w Windows zwykle wynosi 1-3 ms ponad ustawiony Latency Timer.
• Sterowniki FTDI objęte są licencją FTDI. W projektach open-source upewnij się, że dystrybuujesz wyłącznie niezmodyfikowane pakiety.
• Zachowaj zgodność z normami EMC – zbyt wysokie prędkości na liniach UART bez prawidłowego prowadzenia mas mogą generować zakłócenia.
FT_SetUSBParameters(h, 4096, 4096);
FT_SetLatencyTimer(h, 8);
uint8_t rxBuf[256];
DWORD q, r;
while (run) {
FT_GetQueueStatus(h, &q);
if (q) {
DWORD toRead = (q > sizeof(rxBuf)) ? sizeof(rxBuf) : q;
FT_Read(h, rxBuf, toRead, &r);
Process(rxBuf, r);
}
Sleep(1); // lub WaitForSingleObject eventu
}
FT_GetModemStatus
) – jeśli wystąpią, odczytuj częściej lub zwiększ rxBuf
. • Jeżeli PC wykonuje długie bloki obliczeń > 8 ms, nawet 256 B może nie wystarczyć; powiększ bufor lub zastosuj podwójne buforowanie (producer/consumer).
• W niektórych wersjach sterownika Windows 10/11 obserwuje się sporadyczne „bursty” 2–3 × 64 B w jednej ramce USB; margines 256 B wciąż bezpieczny.
• Porównaj latencję dla wartości 2 ms i 8 ms przy tej samej aplikacji – zmierz realne czasy przy pomocy QueryPerformanceCounter
.
• Sprawdź FT232H (Hi-Speed) – inne pakiety, inne bufory.
• Przetestuj tryb overlapped I/O vs. polling – może zmniejszyć opóźnienia w Windows.
Optymalny kompromis dla FT232R @ 115 200 bps i Latency Timer 8 ms to pozostawienie sterownikowych 4 kB oraz użycie bufora aplikacji 256 B, co bezpiecznie mieści do 92 B danych napływających w jednym okresie timera, minimalizuje liczbę wywołań API i zapewnia niską latencję bez zbędnego obciążania procesora.