Den Tipp hast du dir selbst schon gegeben. Wenn du SerRead() mit Timeout 0 aufrufst, bleibt dein asuro hier hängen, solange er kein neues Zeichen empfängt, und kann deshalb die Liniensensoren nicht mehr auswerten:

Code:
   /* blocking */
   else {                     // timeout ist 0
      while (i < length) {    // solange zuwenig Zeichen empfangen wurden
         if (UCSRA & 0x80)    // hat der USART ein Zeichen eingelesen?
            data[i++] = UDR;  // Zeichen in Übergabevariable kopieren
      }
   }
(Aus der Funktion SerRead() in asuro.c)

Deshalb lautet der Kommentar über dem Else-Zweig von "if (timeout != 0) {" auch "blocking".

Gruß

mic