Secondo me il problema non è che salta un secondo, ma che oltre al secondo "canonico" atteso dalla SLEEP devi considerare che c'è il tempo aggiuntivo della lettura dalla seriale, per cui ogni ciclo dura 1 secondo e qualcosina. Ora, tutti questi "qualcosina" man mano si sommano, e producono il ritardo che vedi nel log.
Una soluzione sarebbe calcolare la durata dell'esecuzione del ciclo fino alla sleep tramite la funzione TIMER, e attendere giusto quanto manca per arrivare ad 1 secondo; questo può essere fatto con un loop che termina quando la TIMER ha raggiunto il valore che aveva all'inizio del ciclo più 1.
Esempio
codice:
DO
    t = TIMER + 1

    REM tutto il codice...
    
    REM Attende quanto manca perché il ciclo duri esattamente un secondo
    DO
    LOOP UNTIL TIMER >= t
LOOP WHILE i$ = ""
P.S.: QBasic... quanti ricordi...