Estancado, comando puerto serie

Buenos dias.

Tengo un arduino que recibe comandoS por puerto serie desde un esp8266.
Este recibe A para apagar unos leds, O para diferentes colores B, C, D, E, F.

Este ultimo la F es una secuencia de aproximadamente 50 segundos con una serie de efectos.

Lo que quiero, es que este en el punto en el que este tal secuencia, enviando una A, este se pare. Por mas pruebas que he realizado no lo he conseguido, postear aqui era mi ultima opcion, no soy programador, lo hago como hobby y no tengo grandes conocimientos.

Comentar que el arduino puede recibir varios F, o A, y se van guardando en el buffer, por una parte me va bien, pero si recibo 3/4 F, es un gran problema si no puedo pararlo.

No se si me he explicado con claridad, es algo complejo.

Adjunto el codigo a ver si alguien puede ayudarme a resolverlo.
Gracias.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 3
#define NUMPIXELS 166
int output0 = 0;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(166, PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int intParse(byte length) //return parsed byte from serial
{    
  char BUFFER[length + 1];
  delay(5); //need for Baud 9600, less delay for faster speed
  for(byte i = 0; i < length; i++)    
    BUFFER[i] = Serial.read();   
  BUFFER[length] = 0; //I had this earlier, but not necessary for Arduino.
  return atoi(BUFFER);
}

void setup() {
  Serial.begin(115200);
  Serial.println("");
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code


  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
   ss();
}



void rainbow(uint8_t wait) {
  uint16_t i, j;
  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255)); ss();
    }
    strip.show();
    delay(wait);
  }
}


uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}


void azul() {
   for(int i=0;i<37;i++){ pixels.setPixelColor(i, pixels.Color(0,255,0)); pixels.show();} //ROJO verde AZUL
   for(int u=37;u<166;u++){ pixels.setPixelColor(u, pixels.Color(0,255,0)); pixels.show(); }  
}

void verde() {
 for(int i=0;i<37;i++){ pixels.setPixelColor(i, pixels.Color(0,0,255)); pixels.show();}
 for(int u=37;u<166;u++){ pixels.setPixelColor(u, pixels.Color(0,0,255)); pixels.show();}
}

void blanco() {
 for(int i=0;i<37;i++){ pixels.setPixelColor(i, pixels.Color(255,255,255)); pixels.show();}
 for(int u=37;u<166;u++){ pixels.setPixelColor(u, pixels.Color(0,255,0)); pixels.show(); }
}
void rojo() { for(int i=0;i<166;i++){ pixels.setPixelColor(i, pixels.Color(255,0,0)); pixels.show(); }}
void nada() { for(int i=0;i<166;i++){ pixels.setPixelColor(i, pixels.Color(0,0,0)); pixels.show(); } }



void ss()
{
char input = Serial.read();
  if(input == 'A')  { output0 = intParse(3); nada();   } //nada
  if(input == 'B')  { output0 = intParse(3); verde(); } // Green    
  if(input == 'C')  { output0 = intParse(3); rojo(); } // Red  
  if(input == 'D')  { output0 = intParse(3); azul(); } // Blue
  if(input == 'E')  { output0 = intParse(3); blanco(); } // White RGBW -
  if(input == 'F')  { output0 = intParse(3); rainbow(200); } // multicolor
  }

Para capturar las entradas por puerto serie deberias usar serialEvent() o al menos una consulta al Serial.available().

void loop(){
   if (Serial.available()){
      ss();
   }
}