Serial data not parsed correctly The code I have works for the most part but when I send data via bluetooth received over software serial, too quickly, it is not parsed correctly.

I'm a bit stuck with what can be done to a void the incorrect formatting, since it works correctly if I send data slowly.

I could have a buffer to not send data more than once every set amount of time, but more responsiveness is preferred.

I am sending a string "center:255,0,255;"
it saves the command in a char array untill it sees the ":", then it saves the red in a  char array breaking on "," then same for the blue and green. when it  reaches the ";" it send the four arrays to print to a console. Later it the data will be used to light specific leds based on the command, but when I send data too quickly it gets parsed incorrectly, for example:

command: center
red:195
green:0
blue:255
command: center
red:208
green:0center:221
blue:0,255
command: center
red:246
green:0
blue:255


the 'green:0center:221' isnt correct, its either not seeing the "," or seeing the ";" too soon. Not sure how to avoid it.

#include &lt;SoftwareSerial.h&gt;
SoftwareSerial mySerial(6,7); // RX, TX  

void setup() {  
  Serial.begin(9600);
  mySerial.begin(57600); //required when using the hm-10 with an arduino nano
  mySerial.listen();
} 

void loop() {
  while (mySerial.available () &gt; 0) {
    processIncomingByte (mySerial.read ());  
  }
}

const unsigned int MAX_INPUT = 50;

void processIncomingByte (const byte inByte) {
  static int parse_the_string = 0;
  static char command [MAX_INPUT];
  static char red [MAX_INPUT];
  static char green [MAX_INPUT];
  static char blue [MAX_INPUT];
  static unsigned int input_pos = 0;
  switch (parse_the_string) {
    case 0:
      switch (inByte) {
        case ':':
          command [input_pos] = 0;  // terminating null byte
          input_pos = 0;
          parse_the_string ++; 
          break;
        default:
          if (input_pos &lt; (MAX_INPUT - 1))
            command [input_pos++] = inByte;
          break;
      }
      break;
    case 1:
      switch (inByte) {
        case ',':   // end of text
          red [input_pos] = 0;  // terminating null byte
          input_pos = 0;
          parse_the_string ++; 
          break;
       default:
          if (input_pos &lt; (MAX_INPUT - 1))
            red [input_pos++] = inByte;
          break;
      }
      break;
    case 2:
      switch (inByte) {
        case ',':   // end of text
          green [input_pos] = 0;  // terminating null byte
          input_pos = 0;
          parse_the_string ++;
          break;
        default:
          if (input_pos &lt; (MAX_INPUT - 1))
            green [input_pos++] = inByte;
          break;
      }
      break;
    case 3:
      switch (inByte) {
        case ';':   // end of text
          blue [input_pos] = 0;  // terminating null byte
          // terminator reached! process input_line here ...
          process_data (command, red, green, blue);
          input_pos = 0;
          parse_the_string = 0; 
          break;
        case '\r':   // discard carriage return
          break;
        default:
          if (input_pos &lt; (MAX_INPUT - 1))
            blue [input_pos++] = inByte;
          break;
      }  // end of switch
      break;
    default:
      break;
  }
}

void process_data (const char * command, const char * red, const char * green, const char * blue)
  {
  // for now just display it
  Serial.print ("command: ");
  Serial.println (command);
  Serial.print ("red:");
  Serial.println (red);
  Serial.print ("green:");
  Serial.println (green);
  Serial.print ("blue:");
  Serial.println (blue);
  }
Set higher baud rate for Serial and in Serial Monitor. It slows down the processing and the mySerial buffer overflows.