Perdona kicco, ho letto questi ultimi post, e forse mi sono perso qualcosa prima ma leggo dal codice che hai postato, che è più o meno corretto, che riesci a ricevere tutti i byte nei tempi attesi, togliendo ovviamente quello che è solo di test (loop ritardo, ecc.).
I ritardi messi, i messaggi, qualsiasi cosa al di fuori di quello che riguarda la ricezione vera e propria, o che và ad interfacciarsi ad altre cose esterne anche interne al progetto, possono tutti portare comportamenti anomali, o comunque non controllabili direttamente, e che quindi vanno ad influire sui tempi di risposta che ti aspetti.
Dato che con gambas non puoi utilizzare gli interrupt direttamente, i tempi di elaborazione dipendono molto dall'ambiente, ovvero da quello che fà gambas.
Per verificare quanto dico, potresti provare a creare un progetto console, ovvero senza ambiente grafico, e quindi senza eventi che girano in background, e vedere se i tempi cambiano.
Una volta stabilite le differenze, puoi analizzare come gestire il tutto a livello di applicazione grafica, cercando di ottimizzare le cose in modo che vadano ad influire sui tempi di scambio dati in maniera più leggera possibile.
Oltre a questo, vedo anche stai usando un'interfaccia USB, con molta probabilità tramite convertitore USB-RS232. Già questo potrebbe comportare comportamenti un pò diversi dall'uso diretto di una seriale.
Come ultimo, fare attenzione ai diritti dati ai device. Eventualmente usare utenze impersonali, o aggiungendo l'utenza usata per l'applicazione al gruppo proprietario del device.