Naja eine zufriedenstellende Antwort auf meine Frage war das zwar nicht, aber ich spinne mir mal was zusammen.

g und s hast du ja sozusagen schon raus. Wenn wir mal davon ausgehen, das du jeden Parameter einzeln überträgst, dann könnte man von 3 bzw 4 Strings ausgehen Adresse, SET/GET, Befehl, <Wert>. Also nehmen wir 3 Arrays
uint8_t s1[MAX_STRLEN], s2[MAX_STRLEN], s3[MAX_STRLEN];

Dort wirfst du dann die pch rein, die nicht g oder s sind. Wir gehen jetzt davon aus, das nicht ununterbrochen über den UART was reinkommt.
Bei g oder s setzt du eine Bitvariable(Boolean) auf 1 oder 0.
in s1 bis s3 schreibst du entweder mit ner while char für char oder mit strcpy().
So und nun kannst du mit s1 bis s3 wie mit nem Ringpuffer umgehen und mit Hilfe von 2 Variablen (einmal was lese ich gerade und zum anderen wo schreibe ich gerade) zugreifen.
Kannst auch zum besseren Indizieren gleich ein s1_3[3][MAX_STRLEN] basteln.
Wenn du eine feste Befehls-/Parameterliste hast, geht das auch wieder ohne extra String ähnlich zu g und s. Da bleiben dann nur noch Adresse und Wert übrig. Ich z.B. verwende bei Adresse immer einen ":" vor der Adresse, damit kannst du ganz einfach zwischen Adresse und Wert unterscheiden und kommst sogar ganz ohne extra String aus. Ausser der Wert ist auch mal ein String.

Hoffe das war verständlich.

Übrigens reicht es, wenn du RX_ready am Ende der IF auf 0 setzt, sonst machst du das bei jedem separierten Teilstring.

sast