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
P.S.: QBasic... quanti ricordi...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$ = ""![]()