Come seconda cosa... mi sembra di aver capito che i comandi che arrivano sulla seriale dovrebbero, in teoria, essere ricevuti soltanto una tantum per spegnere e accendere i motori, o per cambiare direzione.
Dico bene?
E a questo punto, mi viene il dubbio che in realtà la seriale stia bufferizzando molti più comandi di quanto ti aspetti, e quindi il programma passa molto tempo all'interno del while a impostarsi le variabili abilitato e direzione, finendo nella seconda parte del loop (quella che effettivamente muove i motori) molto più di rado di quanto ti aspetti.
Magari puoi fare un prova mettendoti un Serial.println(Serial.available()); all'interno del while.