Problema comunicacion puerto serie en ubuntu

Hola a todos!
Os comento el problemiya que tengo. He realizado un programa para controlar unos motores segun el caracter que se le envie por el puerto serie activara un motor u otro.
El caso es que le envio un caracter para activar un motor y funciona, si vuelvo a enviarlo para activar el mismo motor o activar otro diferente, a veces funciona y a veces no, pero siempre acaba "petando" la comunicacion. He probado a utilizar el mismo programa pero sin los motores, simplemente conectando leds en vez de los motores y asi funciona siempre. Resulta que cuando da el error en la comunicacion el SO (ubuntu 12.04) me crea otro puerto diferente tty/ACM1 y si intento cargarle el programa de nuevo me dice que ya no esta en el puerto ACM0 que ahora esta en el ACM1, y asi todas las veces.
Lo unico que se me ocurre es que fuese algo relacionado con los motores, porque con los leds funciona perfectamente.
¿Alguien sabe cual podria ser el problema?
Os dejo aqui el programita que tengo para las pruebas.

#include <avr/interrupt.h>
#include <avr/sleep.h>

volatile int cont;

char entrada;
boolean mem_PET;
boolean mem_Al;
boolean envase;
int entradaAluminio = 4;
int entradaPet = 3;


void setup(){
  cli();
  TCCR2A=0;  
  TCCR2B=(0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(1<<0); // Preescaler a clock/1024
  TIMSK2=(0<<2)|(0<<1)|(1<<0);   // Bit 0.- Overflow
  SMCR=(0<<3)|(0<<2)|(0<<1)|(0<<0); //Power Save Mode
  //Turn off ADC
  ADCSRA=0;
  // TWI | TIMER2 | TIMER0 | VOID | TIMER1 | SPI | USART | ADC
  PRR=(1<<7)|(0<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);  // un "1" apaga el modulo un "0" deja en marcha el modulo
                                                                //activamos: ADC, USART, TIMER2
  // start serial port at 9600 bps:
  Serial.begin(9600);

  //Salidas
  pinMode(7,OUTPUT);  // Motor 2
  pinMode(6,OUTPUT);  // Motor 1
  pinMode(5,OUTPUT);  // Motor 3
  pinMode(4,OUTPUT);  // Motor 4
  pinMode(3,OUTPUT);  //Motor 5
  
  mem_PET = true;
  mem_Al = true;
  envase=false;        
  sei();
}

ISR(TIMER2_OVF_vect){    //vector interrupcion overflow timer2
 cont++;
}
/*==========================*/
void loop()
{
//Serial.println("loop");
  if(Serial.available()>0){
     entrada = ' ';
     
     entrada = Serial.read();
    
     if(entrada == 'b'){
     
       entrada_pet();
     
     }else
     if(entrada == 'c'){
       
       ent_al();
      
       
     }else
     if(entrada == 'd'){
       
         exit();
         
         Serial.println("ok");

     }
  } 


}//LOOP
void retardo(int segundos){
  segundos=segundos*61;
  sleep_enable();
  //sei();
  while (cont < segundos)
   {
   sleep_mode();
   }
  cli();
  sleep_disable();
  cont=0;
  sei();
  
}

void exit() {
    Serial.println("exit");
   envase=true;  
   retardo(1);
   digitalWrite(5,HIGH);   
   retardo(3);   
   digitalWrite(5,LOW);   
   envase=false;  
 
}


void ent_al() {
 
    envase=true;    //hay envase en entrada
       Serial.print('A');      
       Serial.write('0');
       retardo(1);
       digitalWrite(6,HIGH);          
   
       retardo(3);
       digitalWrite(6,LOW);    
       retardo(1);
       digitalWrite(7,HIGH);    
       retardo(5);       
       digitalWrite(7,LOW);    
       
       envase=false;       
       Serial.println(" fin ");      //fin proceso
       Serial.write('0');
  // }//else
}//


void ent_pet(){

   envase=true;  
       Serial.print('P');      
       Serial.write('0');
       retardo(1);
         digitalWrite(6,HIGH);     
  
       retardo(3);
       digitalWrite(6,LOW);
       digitalWrite(7,HIGH); 
       retardo(5);      
       digitalWrite(7,LOW);
   
   envase=false; 
   Serial.println("  fin_Pet");      //fin proceso
     
 
} //funcion