Serial Kommunikation mehrere Zeichen für case Anweisung

Guten Tag,
ich möchte gerne über ein Terminal Programm meine Led´s schalten.
Das heißt, ich schicke "21" Port 2 geht an oder "20" Port 2 geht aus.
Mit einstelligen Ziffern habe ich es geschaft, aber mit zweistelligen geht es nicht.
Ich bekomme immer wieder zurück das die Zahlen anscheinend als einzelne Zeichen behandelt werden.
Was mache ich falsch?

Hier der Code den ich benutze:

const int pin2 = 2; 
const int pin3 = 3; 


void setup()
{
  Serial.begin(9600);
  
  
  pinMode(pin2,OUTPUT); 
  pinMode(pin3,OUTPUT); 
  
}

void loop()
{
  if ( Serial.available())
  {
    int ch = Serial.read(); 
    switch(ch)
    {
      
      case '20': digitalWrite(pin2,LOW); Serial.println("Pin 2 aus"); break; 
      case '21': digitalWrite(pin2,HIGH); Serial.println("Pin 2 an"); break;
      case '30': digitalWrite(pin3,LOW); Serial.println("Pin 3 aus"); break;
      case '31': digitalWrite(pin3,HIGH); Serial.println("Pin 3 an"); break;
      
      
      default: Serial.print(ch); Serial.println("wurde Empfangen, hat aber keine Funktion!"); break; 
    }
  }
}

Ein character ist immer ein Zeichen. Und read() liest auch nur Byte-weise. Das ist wieder so eine doofe C Eigenheit, dass du zwar char c = '11' schreiben kannst, aber dann auch wieder nur '1' drin steht.

Also erst mal musst du zweimal read() machen (und dann auf available() >=2 abfragen), wenn du zwei Zeichen willst. Das könntest du in ein char-Array einlesen. Dann hast du das Problem, dass du strings nicht switchen kannst. Du kannst das Array aber mit atoi() in einen int wanden. Dann hast du 20, 21, etc. als normale Zahl. Das ist für diese Anwendung Overkill, aber Byte-weise in ein char-Array zu schreiben ist allgemein grob der Weg wie man den seriellen Puffer ausliest.

Bei dieser Anwendung ist es sinnvoller man wandelt die ASCII chars per -48 in eine Zahl und macht einfach erste Ziffer * 10 + zweite Ziffer:
int input = 10 * (c1-48) + (c2-48);

Als einfachere Alternative gibt es dafür Serial.parseInt(). Das macht Einlesen und Konvertierung in einem:

if ( Serial.available() >= 2)
{
    int input = Serial.parseInt(); 
    switch(input)
    {
         case 20:
         case 21:
    }
}

Beachte, dass da keine Anführungsstriche bei den Zahlen sind. Das sind Integer Werte. Keine characters oder strings.

Du kannst auch anstatt die Zeichen "2" und "0" die Zahl 20 senden und so einfach im switch nach 20 ecc kontrollieren.
Grüße Uwe

Hallo, ich danke euch.
ParseInt ist genau das was ich gesucht habe.

Jetzt geht es so wie ich es wollte.