Reading multiple bytes from *software* serial I have Arduino Leonardo board operating lots of AC relays in quite noisy environment. USB works unstable, which sometimes causes the board to hang, so I decided to use secondary serial connection as "debug console":

  Serial1.begin(115200); 
  .....
  .....
  if (Serial1.available()) {
    char ch = Serial1.read();
    if ( isalnum(ch) ) {
      switch (ch) {
        case 'M': {
          turnOn_pin_Motor();
          break;
        }
        case 'm': {
          turnOff_pin_Motor();
          break;
        }
        .......


My problem is that noise affects Serial1 the same way it messes USB (but at least it doesn't cause it to freeze). I'd like to use some sort of error checking to prevent Leonardo from acting on "phantom" commands. I could, for example, prefix each keyboard command my Arduino should receive with special symbol, maybe "!".

So I must be reading one char, checking if it is "!" and reading second character.

Unfortunately, I can't modify my code so it would use 2-character buffer and shift its contents as characters arrive, without locking the main loop while waiting for the next char. Any hints on what should I do in this case?
Serial1 on the Arduino Leonardo is hardware serial, not software. 

There are several ways to read in multiple bytes from Serial.

Instead of detecting Serial.available() (i.e. non-zero), change it to Serial.available() &gt;= 2

if (Serial.available() &gt;= 2) {
  for (int i=0; i&lt;2; i++) {
    buffer[i] = Serial.read();
  }
}


Or you can leave it as it is, and read into the buffer one at a time.

static int bufferIndex;

if (Serial.available())
{
    buffer[bufferIndex++] = Serial.read()
}


You'll need to detect the contents of the buffer in another if statement, and also deal with the bounds of the index.

Honestly though, noise is your issue here - this is an example of an XY problem. There's nothing inherent in using a microcontroller with relays that should mean that serial won't work.